判斷存在尤拉迴路的定理:
尤拉通路和尤拉迴路的判定是很簡單的,請看下面的定理及推論。
定理5.1
無向圖g 存在尤拉通路的充要條件是:
g 為連通圖,並且g 僅有兩個奇度結點(度數為奇數的頂點)或者無奇度結點。
推論5.1:
1) 當g 是僅有兩個奇度結點的連通圖時,g 的尤拉通路必以此兩個結點為端點。
2) 當g 是無奇度結點的連通圖時,g 必有尤拉迴路。
3) g 為尤拉圖(存在尤拉迴路)的充分必要條件是g 為無奇度結點的連通圖。
定理5.2
有向圖d 存在尤拉通路的充要條件是:
d 為有向圖,d 的基圖連通,並且所有頂點的出度與入度都相等;或者除兩個頂點外,其餘
頂點的出度與入度都相等,而這兩個頂點中乙個頂點的出度與入度之差為1,另乙個頂點的出度
與入度之差為-1。
推論5.2:
1) 當d 除出、入度之差為1,-1 的兩個頂點之外,其餘頂點的出度與入度都相等時,d 的
有向尤拉通路必以出、入度之差為1 的頂點作為始點,以出、入度之差為-1 的頂點作為
終點。2) 當d 的所有頂點的出、入度都相等時,d 中存在有向尤拉迴路。
3) 有向圖d 為有向尤拉圖的充分必要條件是d 的基圖為連通圖,並且所有頂點的出、入度
都相等。
一:無向圖的判定:
poj 1300
題目描述:
你是一座大莊園的管家。莊園有很多房間,編號為0、1、2、3,...。你的主人是乙個心不在
焉的人,經常沿著走廊隨意地把房間的門開啟。多年來,你掌握了乙個訣竅:沿著乙個通道,穿
過這些大房間,並把房門關上。你的問題是能否找到一條路徑經過所有開著門的房間,並使得:
1) 通過門後立即把門關上;
2) 關上了的門不再開啟;
3) 最後回到你自己的房間(房間0),並且所有的門都已經關閉了。
在本題中,給定房間列表,及連通房間的、開著的門,並給定乙個起始房間,判斷是否存在
這樣的一條路徑。不需要輸出這樣的路徑,只需判斷是否存在。假定任意兩個房間之間都是連通
的(可能需要經過其他房間)。
輸入描述:
輸入檔案包含多個(最多可達100 個)測試資料,每個測試資料之間沒有空行隔開。
每個測試資料報括3 部分:
起始行-格式為「start m n」,其中m 為管理員起始所處的房間號,n 為房間的總數(1
≤n≤20);
房間列表-一共n 行,每行列出了乙個房間通向其他房間的房間號(只需列出比它的號碼大
的房間號,可能有多個,按公升序排列),比如房間3 有門通向房間1、5、7,則房間3 的資訊行內
容為「5 7」,第一行代表房間0,最後一行代表行間n-1。有可能有些行為空行,當然最後一行肯
定是空行,因為n-1 是最大的房間號;兩個房間之間可能有多扇門連通。
終止行-內容為"end"。
輸入檔案最後一行是"endofinput",表示輸入結束。
輸出描述:
每個測試資料對應一行輸出,如果能找到一條路關閉所有的門,並且回到房間0,則輸出"yes
x",x 是他關閉的門的總數,否則輸出"no"。
分析:以房間為頂點、連線房間之間的門為邊構造圖。根據題目的意思,輸入檔案中每個測試資料
所構造的圖都是連通的。本題實際上是判斷乙個圖中是否存在尤拉迴路或尤拉通路,要分兩種情
況考慮:
1) 如果所有的房間都有偶數個門(通往其他房間),那麼有尤拉迴路,可以從0 號房間出發,
回到0 號房間。但是這種情況下,出發的房間必須為0,因為要求回到0 號房間。例如,
第1 個測試資料所對應的圖為圖5.6(a),圖中有淺色陰影的頂點(即頂點0),表示管家
初始時所處的房間;在該測試資料中,管家可以回到0 號房間。
2) 有兩個房間的門數為奇數,其餘的都是偶數,如果出發的房間和0 號房間的門數都是奇
數,那麼也可以從出發的房間到達0 號房間,並且滿足題目要求。但是不能從房間0 出
發,必須從另乙個門數為奇數的房間出發。例如第2、3 個測試資料就是這種情形,對應
的圖為圖(b)和圖(c),輸出的結果分別是"no"和"yes 7"。
對於莊園的其他情形,都是不能完成題目中所要求的任務的,所以直接輸出"no"。
本題的難點在於輸入資料的處理:可以使用sscanf函式處理資料。
#include #include #include #include #include #include #include #include #include #include #include #include #define pi acos(-1.0)
#define mem(a,b) memset(a,b,sizeof(a))
#define sca(a) scanf("%d",&a)
#define pri(a) printf("%d\n",a)
#define m 202
#define inf 100000001
using namespace std;
typedef long long ll;
int main()
,i,j,num=0,odd=0;getchar();
for(i=0;i>a;
for(i=0;i二:有向圖的判定
poj 1386
題目描述:
有些秘門帶有乙個有趣的詞迷。考古學家必須解開詞迷才能開啟門。由於沒有其他方法可以
開啟門,因此詞迷就變得很重要。
每個門上有許多磁碟。每個盤上有乙個單詞,這些磁碟必須重新排列使得每個單詞第乙個字
母跟前乙個單詞最後乙個字母相同。例如單詞"acm"可以跟在單詞"motorola"的後面。你的任務是
編寫乙個程式,讀入一組單詞,然後判定是否可以經過重組使得每個單詞第乙個字母跟前乙個單
詞最後乙個字母相同,這樣才能開啟門。
輸入描述:
輸入檔案中包含t 個測試資料。輸入檔案的第一行就是t,接下來是t 個測試資料。每個測
試資料的第一行是乙個整數n,表示單詞的個數(1≤n≤100000);接下來有n 行,每行是乙個
單詞;每個單詞至少有2 個、至多有1000 個小寫字母,即單詞中只可能出現字母'a'~'z';在同一
個測試資料中,乙個單詞可能出現多次。
輸出描述:
如果通過重組單詞可以達到要求,輸出"ordering is possible.",否則輸出"the door cannot be
opened."。
分析:在本題中,每個單詞只有首尾兩個字母很關鍵,並且每個單詞可以看成連線首尾兩個字母的
一條有向邊(由首字母指向尾字母)。這樣每個測試資料中的一組單詞可以構造成乙個圖:圖中的
頂點為26 個小寫字母,每個單詞為圖中的一條邊。
構造好有向圖後,題目要判定是否可以經過重組使得每個單詞第乙個字母跟前乙個單詞最後
乙個字母相同,等效於判斷圖中是否存在一條路徑經過每條邊一次且僅一次,這就是有向尤拉通
路。本題的處理方法是:
(1) 讀入每個單詞時,因為每個單詞相當於一條從首字母指向尾字母的邊,所以對單詞首字母
對應的頂點,出度加1;尾字母對應的頂點,入度加1;
(2) 26 個頂點的入度和出度都統計完畢後,根據各頂點的出度、入度關係來判斷是否存在歐
拉通路,但要注意排除每個單詞的首尾字母中沒有出現過的字母。在下面的**中,用bused[ ]
陣列來表示每個字母是否在單詞的首尾中出現。
(3) 判斷完以後,還得判斷整個有向圖的基圖(即不考慮邊的方向)是否連通,如圖5.7(b)
所示,每個頂點的出度、入度都相等,但這個圖的基圖是不連通的,所以也不存在有向尤拉通路。
判斷連通最好的方法是使用並查集:考察圖中所有的邊(u, v),如果u 和v 不相同,且u 和v 不在
同乙個連通分量上,則合併u 和v 各自所在的連通分量;
即利用並查集判斷連通不連通!
#include #include #include #include #include #include #include #include #include #include #include #include #define pi acos(-1.0)
#define mem(a,b) memset(a,b,sizeof(a))
#define sca(a) scanf("%d",&a)
#define pri(a) printf("%d\n",a)
#define m 100002
#define inf 100000001
using namespace std;
typedef long long ll;
int t,n,od[26],id[26],exit[26],father[26],rank[26];
char str[1002];
struct edge
e[m];
int find(int x)
void uni(int u,int v)
}int euler()
for(i=0;i1||id[i]-od[i]>1) //因為只有一條路徑連線所有的單詞
if(od[i]==0&&id[i]==0)
if(od[i]-id[i]==1)
}if(id[i]-od[i]==1)}}
if(od1!=id1) flag=0;
else if(!euler()) flag=0;
if(flag) printf("ordering is possible.\n");
else printf("the door cannot be opened.\n");
}return 0;
}
POJ 1300 判斷尤拉迴路
題意 能否找到一條路徑經過所有開著門的房間,並使得 1 通過門後立即把門關上,2 關上的門不在開啟,3 最後回到你自己的房間 房間0 並且所有的門都已經關閉。題目已知這是連通圖。分析 以房間為頂點,連線房間之間的門為邊構造圖。根據題意,輸入檔案的每個測試資料所構造的圖都是連通的。本題實際上是判斷乙個...
尤拉迴路的判定 poj 1300
這個題卡了一上午卡到心態 卡到欲仙欲死。各種bug蜜汁出現。一邊一遍的除錯,忽然發現思考成熟是多麼的重要!最後是乙個短路效應的問題,懷疑人生!這個題就是統計出度和入度,就是建圖有點麻煩,其實也不算太麻煩了。對於無向圖而言就是 判斷是否滿足沒有奇度頂點,或者奇度定點只有兩個,並且這兩個奇度頂點其中乙個...
poj 1300 尤拉迴路 通路 解題報告
最近學了一些dp的皮毛之後,現在開始圖論知識的學習,說實話,初步不知道怎麼弄這個,然後無意間在網上下了一本關於圖論的演算法設計程式的教程,然後感覺還不錯,結果後面才發現原來多年前,我的師兄就給了我這樣一本好的資料。感覺有點小悲催啊。有點對不起師兄的感覺,然後今天終於寫了乙個小知識點,尤拉迴路的一題,...