每个城市有4个城门,每个城门会发出唯一一条边去别的城市的城门。问你能否从城市1出发,经过每个城门恰好一次,再回到城市1。
每个城市的度数都是4,必然存在欧拉回路(如果连通)。欧拉回路显然是一个合法解。
#include<cstdio> #include<vector> using namespace std; struct Edge{ int id,v; }; vector<Edge>G[1010]; int n,sz,path[2010]; bool vis[2010],a[4010][4010]; void dfs(int U){ while(!G[U].empty()){ Edge e=G[U].back(); G[U].pop_back(); if(!vis[e.id]){ vis[e.id]=1; dfs(e.v); } } path[++sz]=U; } int du[1010],anss[4010],ans; int main(){ freopen("courier.in","r",stdin); freopen("courier.out","w",stdout); int x,y; scanf("%d",&n); for(int i=1;i<=(n<<1);++i){ scanf("%d%d",&x,&y); G[(x-1)/4+1].push_back((Edge){i,(y-1)/4+1}); G[(y-1)/4+1].push_back((Edge){i,(x-1)/4+1}); a[x][y]=a[y][x]=1; ++du[(x-1)/4+1]; ++du[(y-1)/4+1]; } dfs(1); if(sz!=2*n+1){ puts("No"); return 0; } for(int i=1;i<sz;++i){ for(int j=4*path[i];j>=4*path[i]-3;--j){ for(int k=4*path[i+1];k>=4*path[i+1]-3;--k){ if(a[j][k]){ anss[++ans]=j; anss[++ans]=k; a[j][k]=a[k][j]=0; goto OUT; } } } puts("No"); return 0; OUT:; } puts("Yes"); for(int i=1;i<ans;++i){ printf("%d ",anss[i]); } printf("%d ",anss[ans]); return 0; }