poj 1300 Door Man 欧拉回路
题目链接:http://poj.org/problem?id=1300
You are a butler in a large mansion. This mansion has so many rooms that they are merely referred to by number (room 0, 1, 2, 3, etc...). Your master is a particularly absent-minded lout and continually leaves doors open throughout a particular floor of the house. Over the years, you have mastered the art of traveling in a single path through the sloppy rooms and closing the doors behind you. Your biggest problem is determining whether it is possible to find a path through the sloppy rooms where you:
- Always shut open doors behind you immediately after passing through
- Never open a closed door
- End up in your chambers (room 0) with all doors closed
In this problem, you are given a list of rooms and open doors between them (along with a starting room). It is not needed to determine a route, only if one is possible.
题意:给出一些房间和房间上的门以及房间之间的路径,如果你沿着这条路走到另一个房间,那么就得关掉这条路上的门,关掉的门不能再打开,问能不能从0号房间,在关掉所有门之后刚好走到房间m。
解法:欧拉回路的判断。
无向图的欧拉回路:连通无向图中没有度数为奇数个的节点或者有且仅有两个奇数个节点(此时这两个节点必须一个为起点,另一个为终点)。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<cmath> 6 #include<algorithm> 7 #define inf 0x7fffffff 8 using namespace std; 9 const int maxn=22; 10 11 int m,n,degree[maxn]; 12 char str[maxn],s[maxn]; 13 14 int main() 15 { 16 while (scanf("%s",str)!=EOF) 17 { 18 if (strcmp(str,"ENDOFINPUT")==0) break; 19 scanf("%d%d",&m,&n); 20 int a; 21 memset(degree,0,sizeof(degree)); 22 memset(s,0,sizeof(s)); 23 int cnt=0; 24 getchar(); 25 for (int i=0 ;i<n ;i++) 26 { 27 gets(s); 28 int len=strlen(s); 29 if (len==0) continue; 30 a=0; 31 int q=0; 32 for (q=0 ;q<len ;q++) if (s[q]!=' ') break; 33 for (int j=q ;j<len ;j++) 34 { 35 if (s[j]==' ') 36 { 37 degree[i] ++ ; 38 degree[a] ++ ; 39 cnt ++ ; 40 a=0;continue; 41 } 42 a=a*10+s[j]-'0'; 43 if (j==len-1) 44 { 45 degree[i] ++ ; 46 degree[a] ++ ; 47 cnt ++ ; 48 } 49 } 50 } 51 scanf("%s",str); 52 a=0; 53 int k=-1,k2=-1; 54 for (int i=0 ;i<n ;i++) 55 { 56 if (degree[i]%2) 57 { 58 a++; 59 if (k==-1) k=i; 60 else k2=i; 61 } 62 } 63 if (a>2 || a==1) printf("NO\n"); 64 else if (a==2) 65 { 66 if ((k==0 && k2==m)||(k==m && k2==0)) printf("YES %d\n",cnt); 67 else printf("NO\n"); 68 } 69 else if (m==0) printf("YES %d\n",cnt); 70 else printf("NO\n"); 71 } 72 return 0; 73 }