1. 程式人生 > >zoj Circle 並查集+出入度檢測

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;   
}