zoj Circle 並查集+出入度檢測
If the graph is just a circle, output "YES", otherwise output "NO"
我們可以知道,若n個點構成一個圓,只有一條迴路,自己與自己不能構成迴路,所以如果能夠成一個圓,那每個節點的出入度都是二並且,查詢每個點,其f[x]都是n。。。
附上程式碼 備忘
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
int f[20];
int cnt[20],cir[20];
int n,m,a,b;
int find(int x)
{
if(f[x]!=x)
f[x]=find(f[x]);
return f[x];
}
void make(int a,int b)
{
int f1=find(a);
int f2=find(b);
if(f2!=f1)
{
cnt[f1]+=cnt[f2];
f[f2]=f1;
}
}
int main()
{
while(cin>>n>>m)
{
int flag=0;
memset(cir,0,sizeof(cir));
for(int i=1;i<=n;i++)
{
f[i]=i;
cnt[i]=1;
}
for(int i=0;i<m;i++)
{
cin>>a>>b;
if(a==b)
{
flag=1;
break;
}
cir[a]++;
cir[b]++;
make(a,b);
}
if(flag)
{
printf("NO\n");
continue;
}
for(int i=1;i<=n;i++)
{
int t=find(i);
if(cnt[t]!=n||cir[i]!=2)
{
flag=1;
break;
}
}
if(flag)
printf("NO\n");
else
printf("YES\n");
}
return 0;
}