zoukankan      html  css  js  c++  java
  • HDU 1878 欧拉回路

    解题思路:即为满足欧拉回路的两个条件就可以了  (1)是连通图(2)顶点度数为偶数

    用并查集写的版本--

    #include<iostream>  
    #include<cstdio>  
    #include<cstring>  
    #include<algorithm>  
    using namespace std;
    int degree[10010],pre[10010];
    int find(int root){ return root == pre[root] ? root : pre[root] = find(pre[root]); }
    void unionroot(int x,int y)
    {
        int root1=find(x);
        int root2=find(y);
        if(root1!=root2) pre[root1]=root2;
       
    }
    int main()
    {
        int m,n,u,v,i;
        while(scanf("%d %d",&n,&m)!=EOF&&n)
        {
            	int flag=1;
            memset(degree,0,sizeof(degree));
            for(i=1;i<=10010;i++)
            pre[i]=i;
            for(i=1;i<=m;i++)
            {
                scanf("%d %d",&u,&v);
                degree[u]++;
                degree[v]++;
                unionroot(u,v); 
            }
            for(i=1;i<=n;i++)
            {
                if(degree[i]!=2)
                {
                    flag=0;
                    break;
                }
                if(find(i)!=find(n))
                {
                    flag=0;
                    break;
                }
            }
            if(flag)
            printf("1
    ");
            else
            printf("0
    ");     
        }
    }
    

      用邻接矩阵储存图,用DFS遍历版本--

    因为对于一个环,只需深度搜索一遍,则所有的点就已经被标记了,如果还有点没有被标记,那么就说明不构成环,再就是还是要满足顶点的度数为偶数

    #include<iostream>  
    #include<cstdio>  
    #include<cstring>  
    #include<algorithm>  
    using namespace std;
    int d[1005][1005],vis[1005],degree[1005];
    void dfs(int u,int n)
    {
    	int i=1;
    	vis[u]=1;
    	for(i=1;i<=n;i++)
    	{
    		if(d[u][i]&&vis[i]==0)
    		dfs(i,n);
    	}	
    }
    
    int main()
    {
    	int n,m,i,j,ans,u,v,flag;
    	while(scanf("%d %d",&n,&m)!=EOF&&n)
    	{
    		memset(d,0,sizeof(d));
    		memset(vis,0,sizeof(vis));
    		memset(degree,0,sizeof(degree));	
    		flag=1;
    		for(i=1;i<=m;i++)
    		{
    			scanf("%d %d",&u,&v);
    			d[u][v]=d[v][u]=1;
    			degree[u]++;
    			degree[v]++;
    		}
    		dfs(1,n);
    		for(i=1;i<=n;i++)
    		{
    			if(vis[i]==0)
    			{
    				flag=0;
    				break;
    			}
    			if(degree[i]%2)
    			{
    				flag=0;
    				break;
    			}			
    		}
    		if(flag)
    		printf("1
    ");
    		else
    		printf("0
    ");		
    	}
    }
    

      

  • 相关阅读:
    迭代器
    【转】javascript中this的四种用法
    【转】CSS(10)盒子模型
    【转】深入理解JVM—JVM内存模型
    【转】深入JVM系列(一)之内存模型与内存分配
    【转】[译]深入理解JVM
    【转】C#中virtual和abstract的区别
    【转】面向对象设计的SOLID原则
    【转】Building a RESTful Web Service
    【转】设计模式:简单工厂、工厂方法、抽象工厂之小结与区别
  • 原文地址:https://www.cnblogs.com/wuyuewoniu/p/4259893.html
Copyright © 2011-2022 走看看