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\n");
        else
        printf("0\n");     
    }
}

  用邻接矩阵储存图,用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\n");
		else
		printf("0\n");		
	}
}

  

posted @ 2015-01-29 14:56  sequenceaa  阅读(149)  评论(0编辑  收藏  举报