2012多校第四场,只做上了一道1007,哈密尔顿回路,
找一条回路,经过每个顶点一次且仅一次。
圆桌武士为模型,很庆幸我经过双连通->网络流->二分匹配->欧拉回路->哈密尔顿回路的思考过程想到了这个模型。
因为Special Judge的答案不是很完备,所以导致我贡献2个WA,1个TLE,加上一下午的思考。。。
4:45让重交一遍,幸运地过了。
附AC代码:该代码也是哈密尔顿回路模板。

#include <string.h> #include <iostream> #include <stdio.h> using namespace std; #define V 200 int n,m; bool c[V][V]; int x[V]; bool flag[V]; void hamilton() { int i, k; bool s[V]; for(i = 0; i < n; i++) { x[i] = -1; s[i] = false; } k = 1; s[0] = true; x[0] = 0; while(k >= 0) { x[k]++; while(x[k] < n) if(!s[x[k]] && c[x[k - 1]][x[k]]) break; else x[k]++; if((x[k] < n) && (k != n - 1)) { s[x[k]] = true; k++; } else if((x[k] < n) && k == n - 1 && c[x[k]][x[0]]) { break; } else { x[k] = -1; k--; s[x[k]] = false; } } } int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int a,b; while(cin >> n >> m){ memset(c,0,sizeof(c)); memset(flag,0,sizeof(flag)); memset(x,0,sizeof(x)); for(int i=0;i<m;i++){ cin >> a >> b; c[a-1][b-1]=c[b-1][a-1]=true; } hamilton(); bool f=0; for(int i=0;i<n;i++){ flag[x[i]]=1; } for(int i=0;i<n;i++){ if(!flag[i]) f=1; } if(f) cout <<"no solution" <<endl; else{ for(int i=0;i<n;i++){ if(i==n-1) cout << x[i]+1 <<endl; else cout << x[i]+1 <<" "; } } } return 0; }