http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3321
所有点度数为2且图联通是充要条件
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=50+5;
int n,m;
int degree[maxn];
int fa[maxn];
int findset(int x)
{
return fa[x]==-1? x:fa[x]=findset(fa[x]);
}
/*
并查集路径压缩
return fa[x]==-1?x:fa[x]=find(fa[x]);
*/
int bind(int u,int v)
{
int fu=findset(u);
int fv=findset(v);
if(fu != fv)
{
fa[fu]=fv;
return 1;
}
return 0;
}
bool ok()
{
for(int i=1; i<=n; i++)
if(degree[i]!=2) return false;//判断度数是否为2
for(int i=2; i<=n; i++)
if(findset(i) != findset(1)) return false;//看图是不是联通;
return true;
}
int main()
{
while(scanf("%d%d",&n,&m)==2)
{
memset(fa,-1,sizeof(fa));
memset(degree,0,sizeof(degree));
while(m--)
{
int u,v;
scanf("%d%d",&u,&v);
degree[u]++;
degree[v]++;
bind(u,v);
}
printf("%s\n",ok()?"YES":"NO");
}
return 0;
}