青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

歐拉環、歐拉路徑的判定和求法

Posted on 2011-03-27 11:06 Mato_No1 閱讀(2481) 評論(3)  編輯 收藏 引用 所屬分類: 網絡流圖算法
歐拉環:圖中經過每條邊一次且僅一次的環;
歐拉路徑:圖中經過每條邊一次且僅一次的路徑;
歐拉圖:有至少一個歐拉環的圖;
半歐拉圖:沒有歐拉環,但有至少一條歐拉路徑的圖。

【無向圖】
一個無向圖是歐拉圖當且僅當該圖是連通的(注意,不考慮圖中度為0的點,因為它們的存在對于圖中是否存在歐拉環、歐拉路徑沒有影響)且所有點的度數都是偶數;一個無向圖是半歐拉圖當且僅當該圖是連通的且有且只有2個點的度數是奇數(此時這兩個點只能作為歐拉路徑的起點和終點);

證明:因為任意一個點,歐拉環(或歐拉路徑)從它這里進去多少次就要出來多少次,故(進去的次數+出來的次數)為偶數,又因為(進去的次數+出來的次數)=該點的度數(根據定義),所以該點的度數為偶數。

【有向圖】
一個有向圖是歐拉圖當且僅當該圖的基圖(將所有有向邊變為無向邊后形成的無向圖,這里同樣不考慮度數為0的點)是連通的且所有點的入度等于出度;一個有向圖是半歐拉圖當且僅當該圖的基圖是連通的且有且只有一個點的入度比出度少1(作為歐拉路徑的起點),有且只有一個點的入度比出度多1(作為終點),其余點的入度等于出度。

證明:與無向圖證明類似,一個點進去多少次就要出來多少次。

【無向圖、有向圖中歐拉環的求法】
與二分圖匹配算法類似,是一個深度優先遍歷的過程,時間復雜度O(M)(因為一條邊最多被訪問一次)。核心代碼(邊是用邊表存儲的而不是鄰接鏈表,因為無向圖中需要對其逆向的邊進行處理,在有向圖中,可以用鄰接鏈表存儲邊):
void dfs(int x)
{
    
int y;
    
for (int p=hd[x]; p != -1; p=ed[p].next) if (!ed[p].vst) {
        y 
= ed[p].b;
        ed[p].vst 
= 1;
        ed[p 
^ 1].vst = 1;     //如果是有向圖則不要這句
        dfs(y);
        res[v
--= y + 1;
    }
}
要注意的是在res中寫入是逆序的,所以初始的v應設成(邊數-1)。
但是有一個問題是,這是遞歸實現的,當點數過多時有爆棧危險,所以最好使用非遞歸:
void dfs()
{
    
int x = 0, y, tp = 1; stk[0= 0;
    re(i, n) now[i] 
= hd[i];
    
bool ff;
    
while (tp) {
        ff 
= 0;
        
for (int p=now[x]; p != -1; p=ed[p].next) if (!ed[p].vst) {
            y 
= ed[p].b;
            ed[p].vst 
= 1;
            ed[p 
^ 1].vst = 1;     //如果是有向圖則不要這句
            now[x] = p; stk[tp++= y; x = y; ff = 1break;
        }
        
if (!ff) {
            res[v
--= x + 1;
            x 
= stk[--tp - 1];
        }
    }
}
當原圖是歐拉圖時,一定可以求出歐拉回路。當原圖是半歐拉圖時,求歐拉路徑,只要找到起點i和終點j,添加邊<j, i>(或(j, i)),求歐拉環,再在求出的歐拉環中刪除添加的新邊即可。

不過最為BT的還不是這個,而是接下來的——
【混合圖】
混合圖(既有有向邊又有無向邊的圖)中歐拉環、歐拉路徑的判定需要借助網絡流!

(1)歐拉環的判定:
一開始當然是判斷原圖的基圖是否連通,若不連通則一定不存在歐拉環或歐拉路徑(不考慮度數為0的點)。

其實,難點在于圖中的無向邊,需要對所有的無向邊定向(指定一個方向,使之變為有向邊),使整個圖變成一個有向歐拉圖(或有向半歐拉圖)。若存在一個定向滿足此條件,則原圖是歐拉圖(或半歐拉圖)否則不是。關鍵就是如何定向?

首先給原圖中的每條無向邊隨便指定一個方向(稱為初始定向),將原圖改為有向圖G',然后的任務就是改變G'中某些邊的方向(當然是無向邊轉化來的,原混合圖中的有向邊不能動)使其滿足每個點的入度等于出度。
設D[i]為G'中(點i的出度 - 點i的入度)。可以發現,在改變G'中邊的方向的過程中,任何點的D值的奇偶性都不會發生改變(設將邊<i, j>改為<j, i>,則i入度加1出度減1,j入度減1出度加1,兩者之差加2或減2,奇偶性不變)!而最終要求的是每個點的入度等于出度,即每個點的D值都為0,是偶數,故可得:若初始定向得到的G'中任意一個點的D值是奇數,那么原圖中一定不存在歐拉環!

若初始D值都是偶數,則將G'改裝成網絡:設立源點S和匯點T,對于每個D[i]>0的點i,連邊<S, i>,容量為D[i]/2;對于每個D[j]<0的點j,連邊<j, T>,容量為-D[j]/2;G'中的每條邊在網絡中仍保留,容量為1(表示該邊最多只能被改變方向一次)。求這個網絡的最大流,若S引出的所有邊均滿流,則原混合圖是歐拉圖,將網絡中所有流量為1的中間邊(就是不與S或T關聯的邊)在G'中改變方向,形成的新圖G''一定是有向歐拉圖;若S引出的邊中有的沒有滿流,則原混合圖不是歐拉圖。

為什么能這樣建圖?
考慮網絡中的一條增廣路徑S-->i-->...-->j-->T,將這條從i到j的路徑在G'中全部反向,則:i的入度加1出度減1,j的入度減1出度加1,路徑中其它點的入度出度均不變。而i是和S相連的,因此初始D[i]>0,即i的出度大于入度,故這樣反向之后D[i]減少2;同理,j是和T相連的,這樣反向之后D[j]增加2。因此,若最大流中邊<S, i>滿流(流量為初始D[i]/2),此時D[i]值就變成了0,也就是i的入度等于出度。因此只要使所有S引出的邊全部滿流,所有初始D值>0的點的D值將等于0,又因為將邊變向后所有點的D值之和不變,所有初始D值小于0的點的D值也將等于0,而初始D值等于0的D點既不與S相連也不與T相連,所以它們是網絡中的中間點,而中間點的流入量等于流出量,故它們的入度和出度一直不變,即D值一直為0。因此,整個圖G'成為歐拉圖。

(2)歐拉路徑的判定:
首先可以想到的是枚舉歐拉路徑的起點i和終點j,然后在圖中添加邊<j, i>,再求圖中是否有歐拉回路即可。但是,該算法的時間復雜度達到了O(M * 最大流的時間),需要優化。
前面已經說過,在將邊變向的過程中任何點的D值的奇偶性都不會改變,而一個有向圖有歐拉路徑的充要條件是基圖連通且有且只有一個點的入度比出度少1(作為歐拉路徑的起點),有且只有一個點的入度比出度多1(作為終點),其余點的入度等于出度。這就說明,先把圖中的無向邊隨便定向,然后求每個點的D值,若有且只有兩個點的初始D值為奇數,其余的點初始D值都為偶數,則有可能存在歐拉路徑(否則不可能存在)。進一步,檢查這兩個初始D值為奇數的點,設為點i和點j,若有D[i]>0且D[j]<0,則i作起點j作終點(否則若D[i]與D[j]同號則不存在歐拉路徑),連邊<j, i>,求是否存在歐拉環即可(將求出的歐拉環中刪去邊<j, i>即可)。這樣只需求一次最大流。

【典型例題】Sightseeing tour(PKU1637,ZJU1992)
本題就是求混合圖的歐拉環問題,題目中已經說明圖是連通的(Input的最后一句話),故不需判連通。
(本沙茶一開始把DFS中的l0 = aug中的"= aug"寫漏了,TLE了N次)
#include <iostream>
#include 
<stdio.h>
#include 
<string.h>
using namespace std;
#define re(i, n) for (int i=0; i<n; i++)
const int MAXN = 2002, MAXM = 10000, INF = ~0U >> 2;
struct edge {
    
int a, b, f, next;
    edge () {}
    edge (
int _a, int _b, int _f): a(_a), b(_b), f(_f), next(-1) {}
} ed[MAXM 
+ MAXM];
int n, m, s, t, D[MAXN], hd[MAXN], tl[MAXN], lb[MAXN], vl[MAXN], flow, lmt;
bool res;
int dfs(int i, int aug)
{
    
if (i == t) {flow += aug; return aug;}
    
int l0 = aug, l1, j, f0;
    
for (int p=hd[i]; p != -1; p=ed[p].next) {
        j 
= ed[p].b; f0 = ed[p].f;
        
if (lb[i] == lb[j] + 1 && f0) {
            l1 
= dfs(j, l0 <= f0 ? l0 : f0);
            l0 
-= l1; ed[p].f -= l1; ed[p ^ 1].f += l1;
            
if (lb[s] == n || !l0) return aug;
        }
    }
    
int minlb = n - 1;
    
for (int p=hd[i]; p != -1; p=ed[p].next) if (ed[p].f) {
        j 
= ed[p].b;
        
if (lb[j] < minlb) minlb = lb[j];
    }
    
if (--vl[lb[i]]) vl[lb[i] = minlb + 1]++else lb[s] = n;
    
return aug - l0;
}
inline 
void add_edge(int a, int b, int f)
{
    ed[m] 
= edge(a, b, f);
    
if (hd[a] != -1) tl[a] = ed[tl[a]].next = m++else hd[a] = tl[a] = m++;
    ed[m] 
= edge(b, a, 0);
    
if (hd[b] != -1) tl[b] = ed[tl[b]].next = m++else hd[b] = tl[b] = m++;
}
void solve()
{
    
int tests;
    scanf(
"%d"&tests);
    
int n0, m0, a0, b0, f;
    re(testno, tests) {
        scanf(
"%d%d"&n0, &m0);
        n 
= n0 + 2; m = 0; s = 0; t = n - 1;
        memset(D, 
0, n0 << 2); memset(hd, -1, n << 2); memset(tl, -1, n << 2);
        re(i, m0) {
            scanf(
"%d%d%d"&a0, &b0, &f);
            D[a0 
- 1]++; D[b0 - 1]--;
            
if (!f) add_edge(a0, b0, 1);
        }
        res 
= 1; lmt = 0; flow = 0;
        re(i, n0) {
            
if (D[i] % 2) {res = 0break;}
            
if (D[i] > 0) {add_edge(s, i + 1, D[i] >> 1); lmt += D[i] >> 1;}
            
if (D[i] < 0) add_edge(i + 1, t, -D[i] >> 1);
        }
        
if (res) {
            memset(lb, 
0, n << 2); vl[0= n; memset(vl + 10, n << 2);
            
while (lb[s] < n) dfs(s, INF);
            
if (flow < lmt) res = 0;
        }
        puts(res 
? "possible" : "impossible");
    }
}
int main()
{
    solve();
    
return 0;
}

Feedback

# re: 歐拉環、歐拉路徑的判定和求法  回復  更多評論   

2012-06-23 20:59 by SHUXK
請問一個問題:
在混合圖的歐拉路徑判定中,“若D[i]與D[j]同號則不存在歐拉路徑”。我對此有一個疑問。
那么如果是因為對無向邊定向導致D[i]與D[j]同號,那么有可能仍然有歐拉路徑(比如有向邊比無向邊少得多的情況,此時可能將與i連接的無向邊都連向i,將與j連接的無向邊都連向j,使得D[i]和D[j]都很大)。

# re: 歐拉環、歐拉路徑的判定和求法  回復  更多評論   

2012-06-23 21:45 by SHUXK
最后一句講反了,應該是使D[i]和D[j]都很小

# re: 歐拉環、歐拉路徑的判定和求法  回復  更多評論   

2012-07-29 19:17 by Mato_No1
@SHUXK
額……確實是的,即使D[i]和D[j]同號也有可能存在歐拉路徑,所以要試兩次囧……
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲伦理精品| 欧美一区激情| 久久男人资源视频| 亚洲免费小视频| 亚洲精品中文字| 在线一区欧美| 先锋影音一区二区三区| 久久精品日韩欧美| 蜜臀av在线播放一区二区三区 | 亚洲欧美综合v| 性欧美videos另类喷潮| 久久久久国产精品午夜一区| 久热精品视频在线观看| 亚洲激情视频| 亚洲国产一区二区精品专区| 99精品国产高清一区二区 | 亚洲人成绝费网站色www| 9久re热视频在线精品| 午夜精品久久久久久久久久久久久| 午夜免费电影一区在线观看| 蜜臀91精品一区二区三区| 欧美午夜精品久久久久免费视| 国产精品视频导航| 亚洲日本va午夜在线电影| 亚洲欧美日韩人成在线播放| 欧美aⅴ99久久黑人专区| 一区二区高清在线观看| 久久久国产视频91| 欧美日韩视频在线第一区| 韩国三级电影久久久久久| 日韩亚洲精品视频| 久久久女女女女999久久| 亚洲欧洲精品一区二区三区| 欧美一区二视频| 国产精品三区www17con| 亚洲精品一线二线三线无人区| 久久精品理论片| 99热免费精品| 欧美激情一区二区三区不卡| 亚洲欧美区自拍先锋| 女同性一区二区三区人了人一 | 国产精品久久久久久久久久三级| 在线观看视频一区二区欧美日韩 | 亚洲视频欧美视频| 欧美国产日本| 久久全球大尺度高清视频| 国产伦精品一区二区三区视频孕妇 | 久久久国产亚洲精品| 蜜桃av综合| 亚洲午夜国产成人av电影男同| 亚洲国产黄色片| 亚洲男女自偷自拍图片另类| 欧美日韩国产首页| 亚洲电影免费观看高清完整版在线观看| 日韩午夜在线播放| 久久综合伊人77777麻豆| 亚洲日本精品国产第一区| 男女精品视频| 亚洲国产毛片完整版| 男人的天堂亚洲| 久久亚洲国产成人| 一区二区三区在线观看国产| 久久国产精品99国产| 亚洲免费观看高清完整版在线观看熊 | 亚洲日本成人| 玖玖玖国产精品| 亚洲电影一级黄| 欧美二区在线看| 免费高清在线视频一区·| 亚洲国产精品123| 亚洲国产另类精品专区| 欧美国产日韩一二三区| 一区二区三区高清在线观看| 亚洲乱码一区二区| 欧美日韩在线一区二区三区| 亚洲欧美日韩国产综合在线| 正在播放欧美一区| 国产免费一区二区三区香蕉精| 亚洲免费在线观看| 欧美一区二区三区精品| 在线日本成人| 亚洲精品一区二区三区四区高清 | 欧美一区二区免费| 性欧美大战久久久久久久免费观看| 国产欧美亚洲视频| 另类酷文…触手系列精品集v1小说| 久久躁日日躁aaaaxxxx| 日韩天堂在线观看| 亚洲宅男天堂在线观看无病毒| 国产一区二区三区在线观看免费视频 | 欧美大片一区二区三区| 99精品视频免费全部在线| 99精品国产一区二区青青牛奶| 国产精品xvideos88| 久久蜜臀精品av| 欧美精品在线视频观看| 久久精彩视频| 欧美精品一区三区| 久久精品人人做人人爽电影蜜月| 欧美成人久久| 久久久久看片| 欧美午夜宅男影院| 欧美~级网站不卡| 国产精品久久久久久超碰| 麻豆精品传媒视频| 国产精品高潮呻吟久久| 欧美国产精品va在线观看| 国产精品实拍| 亚洲精品欧美日韩专区| 亚洲丰满少妇videoshd| 午夜精品美女久久久久av福利| 日韩一级黄色片| 久久一区精品| 久久久久.com| 国产精品久久久一区二区| 亚洲国产婷婷综合在线精品 | 亚洲欧美中文日韩在线| 美女图片一区二区| 久久狠狠婷婷| 国产精品亚洲а∨天堂免在线| 亚洲国产日韩一区| 在线不卡中文字幕| 欧美在线播放视频| 羞羞视频在线观看欧美| 国产精品v日韩精品| 亚洲精品国产品国语在线app| 在线观看国产精品淫| 欧美伊人久久久久久午夜久久久久| 亚洲一级二级在线| 欧美另类一区| 亚洲三级电影全部在线观看高清| 伊人成人网在线看| 欧美在线免费视频| 久久男人av资源网站| 国外成人在线| 久久久久久久性| 亚洲激情另类| 久久综合网络一区二区| 猫咪成人在线观看| 亚洲国产成人精品久久久国产成人一区 | 久久av老司机精品网站导航| 亚洲欧美激情视频在线观看一区二区三区| 老司机免费视频久久| 久久综合九色综合欧美就去吻| 国产在线精品二区| 久久精品国产免费观看| 久久久亚洲精品一区二区三区| 狠狠久久亚洲欧美专区| 久久久久久免费| 麻豆成人综合网| 亚洲精品免费看| 欧美久久视频| 亚洲亚洲精品在线观看 | 亚洲午夜一区二区三区| 一本一本久久| 国产精品va在线播放| 中文av字幕一区| 欧美一区二区三区在线免费观看| 国产日韩欧美中文在线播放| 亚洲永久免费观看| 久久另类ts人妖一区二区| 一区二区亚洲精品| 免费观看在线综合色| 亚洲国产电影| 亚洲欧美激情诱惑| 国外精品视频| 欧美大片一区二区| 一区二区三区你懂的| 久久夜色精品| 亚洲毛片av| 国产精品久久久久久模特| 亚洲欧美成人在线| 免费视频一区| 亚洲午夜精品一区二区三区他趣| 99亚洲视频| 欧美在线看片| 在线日韩日本国产亚洲| 欧美日韩高清在线播放| 亚洲免费伊人电影在线观看av| 美女亚洲精品| 中文国产成人精品| 国产综合自拍| 欧美精品在线一区二区三区| 亚洲欧美日韩一区| 亚洲国产日韩欧美综合久久| 国产精品高潮呻吟久久| 老司机精品视频一区二区三区| 日韩一级精品视频在线观看| 久久久欧美精品| 亚洲专区国产精品| 欧美国产第一页| 亚洲欧美在线一区二区| 亚洲高清在线观看| 久久久久久久一区| 亚洲私人影院在线观看| 日韩视频专区| 亚洲福利在线观看| 国产欧美日韩91| 欧美日韩综合一区| 男人插女人欧美|