【欧拉回路】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;
}
posted @ 2017-07-07 13:49  AutSky_JadeK  阅读(158)  评论(0编辑  收藏  举报
TVアニメ「Charlotte(シャーロット)」公式サイト TVアニメ「Charlotte(シャーロット)」公式サイト