弱的一笔啊!!
都知道这题是欧拉路径都还Wa了那么久。。。伤心!
原来欧拉路径的压栈一定要在dfs()之后压。。。
这题就是将牌骨的数字看做点,把牌看做连接两点的边。。。这样就成了欧拉路了
// File Name: 1002.cpp // Author: zlbing // Created Time: 2013/2/24 11:39:49 #include<iostream> #include<string> #include<algorithm> #include<cstdlib> #include<cstdio> #include<set> #include<map> #include<vector> #include<cstring> #include<stack> #include<cmath> #include<queue> using namespace std; #define CL(x,v); memset(x,v,sizeof(x)); #define INF 0x3f3f3f3f #define MAXN 20005 struct Edge{ int from,to; }; vector<int>G[MAXN]; vector<Edge>edges; int A[MAXN]; vector<int> E; int vis[MAXN]; void dfs(int u) { for(int i=0;i<G[u].size();i++) { int m=G[u][i]; Edge& e=edges[G[u][i]]; int v=e.to; if(vis[m])continue; vis[m]=vis[m^1]=1; //E.push_back(m);把这句写在这里 Wa了好久。。。原来我一直没明白欧拉路的原理.. dfs(v); E.push_back(m); } } int main(){ int n; while(~scanf("%d",&n)) { int a,b; for(int i=0;i<7;i++)G[i].clear(); edges.clear(); E.clear(); CL(A,0); int S=0; for(int i=0;i<n;i++) { scanf("%d%d",&a,&b); A[a]++,A[b]++; edges.push_back((Edge){a,b}); int m=edges.size(); G[a].push_back(m-1); edges.push_back((Edge){b,a}); m=edges.size(); G[b].push_back(m-1); } for(int i=0;i<7;i++) if(A[i]){ S=i;break; } CL(vis,0); int cnt=0; for(int i=0;i<7;i++) if(A[i]%2) { S=i;cnt++; } if(!(cnt==0||cnt==2)){ printf("No solution\n"); continue; } dfs(S); if(E.size()!=n) { printf("No solution\n"); continue; } for(int i=E.size()-1;i>=0;i--){ printf("%d ",(E[i]/2)+1); if(E[i]%2)printf("-\n"); else printf("+\n"); } } return 0; }