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
    ");		
    	}
    }
    

      

  • 相关阅读:
    angularjs 中使用 service 在controller 之间 share 对象和数据
    angularjs 中实现 load more 功能
    MVC 中对返回的 data 进行压缩
    linq中如何合并多个predicate条件
    mysql安装常见问题
    Ehcache的CacheManager的使用
    Java Web开发——Filter过滤器
    Java Web开发——Servlet监听器
    JSP内置对象
    JSP指令与动作
  • 原文地址:https://www.cnblogs.com/wuyuewoniu/p/4259893.html
Copyright © 2011-2022 走看看