【欧拉回路】Gym - 101411C - Courier's Route
每个城市有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\n",anss[ans]);
return 0;
}
——The Solution By AutSky_JadeK From UESTC
转载请注明出处:http://www.cnblogs.com/autsky-jadek/

浙公网安备 33010602011771号
