#1176 : 欧拉路·一(欧拉通路的判定)
#1176 : 歐拉路·一
時間限制:10000ms 單點時限:1000ms 內存限制:256MB描述
小Hi和小Ho最近在玩一個解密類的游戲,他們需要控制角色在一片原始叢林里面探險,收集道具,并找到最后的寶藏。現在他們控制的角色來到了一個很大的湖邊。湖上有N個小島(編號1…N),以及連接小島的M座木橋。每座木橋上各有一個寶箱,里面似乎裝著什么道具。
湖邊還有一個船夫,船夫告訴主角。他可以載著主角到任意一個島上,并且可以從任意一個島上再載著主角回到湖邊,但是主角只有一次來回的機會。同時船夫告訴主角,連接島嶼之間的木橋很脆弱,走過一次之后就會斷掉。
因為不知道寶箱內有什么道具,小Hi和小Ho覺得如果能把所有的道具收集齊肯定是最好的,那么對于當前島嶼和木橋的情況,能否將所有道具收集齊呢?
舉個例子,比如一個由6個小島和8座橋組成的地圖:
主角可以先到達4號小島,然后按照4->1->2->4->5->6->3->2->5的順序到達5號小島,然后船夫到5號小島將主角接回湖邊。這樣主角就將所有橋上的道具都收集齊了。
提示:歐拉路的判定
輸入
第1行:2個正整數,N,M。分別表示島嶼數量和木橋數量。1≤N≤10,000,1≤M≤50,000
第2…M+1行:每行2個整數,u,v。表示有一座木橋連接著編號為u和編號為v的島嶼,兩個島之間可能有多座橋。1≤u,v≤N
輸出
第1行:1個字符串,如果能收集齊所有的道具輸出“Full”,否則輸出”Part”。
樣例輸入
6 8
1 2
1 4
2 4
2 5
2 3
3 6
4 5
5 6
樣例輸出
Full
涉及到的知識點:
思路:
判斷歐拉通路:判斷它是否為歐拉圖或半歐拉圖即可。
本題是無向圖,認真讀題,它給的一定是連通圖(所以無需判斷連通性),所以根據上述定理1和2只需要統計奇度頂點個數即可。
AC代碼:
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> using namespace std; const int N = 1e4+5; int d[N]; /* struct Edge {int from;int to;int nxt; }edge[N*5]; int head[N],idx; bool vis[N]; int total; void init() {memset(head,-1,sizeof(head));idx = 0; } void add_edge(int from,int to) {edge[idx].from = from;edge[idx].to = to;edge[idx].nxt = head[from];head[from] = idx++; } void dfs(int s) {for(int i = head[s]; ~i; i = edge[i].nxt){int to = edge[i].to;if(!vis[to]){vis[to] = true;total++;dfs(to);}} } */ int main() {int n,m;scanf("%d%d",&n,&m);//init();while(m--){int x,y;scanf("%d%d",&x,&y);d[x]++;d[y]++;//add_edge(x,y);//add_edge(y,x);}int cnt = 0;for(int i = 1; i <= n; i++){cnt += d[i] & 1;}bool flag = false;if(cnt == 0 || cnt == 2){/*vis[1] = true;total = 1;dfs(1);*/flag = true;}flag?puts("Full"):puts("Part");return 0; }總結
以上是生活随笔為你收集整理的#1176 : 欧拉路·一(欧拉通路的判定)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: poj1985 Cow Marathon
- 下一篇: #1181 : 欧拉路·二(无向图的欧拉