您的位置:首页 > 其它

HDU 1878 欧拉回路

2015-01-29 14:56 253 查看
解题思路:即为满足欧拉回路的两个条件就可以了 (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");
}
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: