题目链接:http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=19493
题目大意:
给定一张无向图,问是否有可能一次走遍所有边并回到起点,每条边只能走一次。
解题:
从有边相连的点出发,遍历所有点,判断连通性。(注意不是从0出发,因为0可能是孤立点)同时判断每个点度数,度数不能为奇数。用并查集也可以。
坑点:
1. 因为有孤立点,所以要判断是否有边相连。
2.边数为0,输出Not Possible
代码:
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
bool mapp[205][205];
int degree[205];
bool vis[205],has_edge[205];
int n,r,a,b;
void dfs(int x)
{
vis[x]=1;
for(int i=0;i<n;i++)
if(!vis[i]&&mapp[x][i])
dfs(i);
}
int main()
{
bool flag;
while(~scanf("%d%d",&n,&r))
{
if(r==0)
{
printf("Not Possible\n");
continue;
}
flag=true;
memset(mapp,0,sizeof(mapp));
memset(degree,0,sizeof(degree));
memset(has_edge,0,sizeof(has_edge));
memset(vis,0,sizeof(vis));
for(int i=0;i<r;i++)
{
scanf("%d%d",&a,&b);
degree[a]++;
degree[b]++;
has_edge[a]=1;
has_edge[b]=1;
mapp[a][b]=mapp[b][a]=1;
}
for(int i=0;i<n;i++)
{
if(degree[i]%2)
{
flag=false;
break;
}
}
if(flag)
{
for(int i=0;i<n;i++)
{
if(has_edge[i])
{
dfs(i);
break;
}
}
for(int i=0;i<n;i++)
{
if(has_edge[i]&&(!vis[i]))
{
flag=false;
break;
}
}
}
if(flag)
printf("Possible\n");
else
printf("Not Possible\n");
}
return 0;
}