zoukankan      html  css  js  c++  java
  • 【欧拉回路】Gym

    每个城市有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;
    }
  • 相关阅读:
    html 父容器和子容器通信
    5.7.13mysql 无法登陆
    c# foreach枚举器
    WPF bitmap转bitmapimage 使用 CreateBitmapSourceFromHBitmap内存泄漏
    c# 另存为excel
    CRC循环校验码
    一般处理程序
    DSS->数仓->数据集市->数据湖->数据中台->商业智能
    常见的消息中间件对比
    Dockerfile详解
  • 原文地址:https://www.cnblogs.com/autsky-jadek/p/7131823.html
Copyright © 2011-2022 走看看