最近學了一些dp的皮毛之後,現在開始圖論知識的學習,說實話,初步不知道怎麼弄這個,然後無意間在網上下了一本關於圖論的演算法設計程式的教程,然後感覺還不錯,結果後面才發現原來多年前,我的師兄就給了我這樣一本好的資料。
感覺有點小悲催啊。。~ 有點對不起師兄的感覺,然後今天終於寫了乙個小知識點,尤拉迴路的一題,其實這個也包含了通路的知識。
還是說一下題意吧。。
現在你是乙個豪宅的管家,因為你有個粗心的主人,所以需要你來幫忙管理,輸入會告訴你現在一共有多少個房間,然後會告訴你從哪個房間出發,你的任務就是從出發的房間通過各個房間之間的通道,來把所有的門都關上,然後最後回到0的房間。
一開始寫的時候,我想因為我自己不是很熟悉圖論的知識點,所以我就想用模擬的方法來做一做,結果讓我碰對了,說實話 我不知道這樣的深搜都可以過。。
view code
1 #include2 #include3using
namespace
std;
4int graph[22][22
]; 5
intn,count,edgetotal,flag;
6void dfs(inti)7
//當你回到0房間的時候已經關閉了所有的門,那麼就可以完成
10for(int j=0;j)
11 23}
24}25int
main()
26sub++;
36while(sub10+(temp[sub]-48);sub++;}
37 memset(graph,0,sizeof
(graph));
38for(int i=0;i)
3946 graph[i][end]++;
47 graph[end][i]++;
48 edgetotal++;49}
50}51gets(temp);
52dfs(start);
53if(flag)printf("
yes %d\n
",edgetotal);
54else
55 printf("
no\n");
56}57return
0; 58}
59其實實際上,最好的解題方法還是來自圖論當中的知識,相信有一點圖論知識的人都知道,現在給你n個節點,那麼這些節點當中如果每個節點的度都是偶數的話,那麼一定可以從乙個點出發然後回到這個點,並且訪問整個路徑當中的邊。
60如果是要測試出通路的話,那麼就是檢查是否存在兩個度為基數的節點,兩個節點分別為起點和終點。
61 #include62 #include63
using
namespace
std;
64int
main()
6584 door[i]++;
85 door[end]++;
86 door_total++;87}
88}89gets(temp);
90 door_num=0;91
for(int i=0;i)
92
95if(door_num==0&&door_start==0)printf("
yes %d\n
",door_total);
96//
如果不存在基數度的節點,那麼當起點是0的時候,一定可以完成迴路,訪問所有的邊。
97else
98if(door_num==2&&door[0]%2==1&&door[door_start]%2==1&&door_start!=0)printf("
yes %d\n
",door_total);//
如果基數點為2的話,那麼當兩個基數點為起點和終點的時候,此時只要終點與起點不重合,那麼就可以完成通路,訪問所有的邊。
99else
100 printf("
no\n");
101}
102return
0;
103 }
POJ 1300 判斷尤拉迴路
題意 能否找到一條路徑經過所有開著門的房間,並使得 1 通過門後立即把門關上,2 關上的門不在開啟,3 最後回到你自己的房間 房間0 並且所有的門都已經關閉。題目已知這是連通圖。分析 以房間為頂點,連線房間之間的門為邊構造圖。根據題意,輸入檔案的每個測試資料所構造的圖都是連通的。本題實際上是判斷乙個...
尤拉迴路的判定 poj 1300
這個題卡了一上午卡到心態 卡到欲仙欲死。各種bug蜜汁出現。一邊一遍的除錯,忽然發現思考成熟是多麼的重要!最後是乙個短路效應的問題,懷疑人生!這個題就是統計出度和入度,就是建圖有點麻煩,其實也不算太麻煩了。對於無向圖而言就是 判斷是否滿足沒有奇度頂點,或者奇度定點只有兩個,並且這兩個奇度頂點其中乙個...
POJ 1300 閱讀理解 噁心輸入 尤拉迴路
題意不太好理解.大致上 是從某個指定的房間出發.問能否回到0房間.並且關掉圖中所有的門.而門是關上後無法開啟的.輸入比較奇葩.我是gets讀入一行後再處理的.再抽象一些.把門開作邊.那麼相當於找一條路徑.使得便利所有的邊.且每個邊只遍歷一次.這裡分為兩種情況.一種是從0出發.走完所有的邊回到0.這是...