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;
    }
  • 相关阅读:
    POJ 1265 Pcik定理
    POJ 1380 坐标旋转
    POJ 1788
    POJ 3714 平面最近点对
    POJ 1905 二分
    POJ 1151 矩形面积并
    POJ 1654 多边形面积
    ZOJ 1010 判断简单多边形+求面积
    about work
    Python 打印 不换行
  • 原文地址:https://www.cnblogs.com/autsky-jadek/p/7131823.html
Copyright © 2011-2022 走看看