ZOJ 3332 (哈密顿路竞赛图)
参考:http://www.cnblogs.com/zhixingqiezhixing/archive/2012/04/21/2462351.html
View Code
1 /* 2 ZOJ :3332 3 思路: 4 这是个竞赛图问题 5 寻找图中的哈密顿路 6 竞赛图中一定有哈密顿路, 7 竞赛图去掉一个顶点和其关联的边仍是竞赛图 8 参考文献 哈密顿路 及 竞赛图 9 */ 10 #include<iostream> 11 #include<cstdio> 12 #include<cstring> 13 #include<list> 14 using namespace std; 15 16 const int con=110; 17 18 bool map[con][con]; 19 list<int> path; 20 list<int>::iterator cur,pre; 21 22 int main() 23 { 24 int t,n,i,x,y; 25 bool f; 26 //freopen("in.txt","r",stdin); 27 //freopen("out.txt","w",stdout); 28 scanf("%d",&t); 29 while(t--) 30 { 31 memset(map,0,sizeof(map)); 32 scanf("%d",&n); 33 int ct=n*(n-1)/2; 34 for(i=0;i!=ct;++i) 35 { 36 scanf("%d%d",&x,&y); 37 map[x][y]=true; 38 } 39 path.clear(); 40 path.push_back(1); 41 42 for(i=2;i<=n;++i) 43 { 44 f=0; 45 cur=path.begin(); 46 if(map[i][*cur]) 47 { 48 path.push_front(i); 49 f=1; 50 continue; 51 } 52 cur=path.end(); 53 cur--; 54 if(map[*cur][i]) 55 { 56 path.push_back(i); 57 f=1; 58 continue; 59 } 60 cur=pre=path.begin(); 61 cur++; 62 63 while(cur!=path.end()) 64 { 65 if(map[*pre][i]&&map[i][*cur]) 66 { 67 path.insert(cur,i); 68 f=1; 69 break; 70 } 71 pre++; 72 cur++; 73 } 74 if(!f)break; 75 } 76 77 if(i<=n)printf("Impossible\n"); 78 else 79 { 80 for(cur=path.begin();cur!=path.end();cur++) 81 { 82 if(cur != path.begin())//注意输出时的空格最后一个数字后不能有空格 83 printf(" "); 84 printf("%d", *cur); 85 } 86 printf("\n"); 87 } 88 } 89 system("pause"); 90 return 0; 91 }