HDU1272

題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1272

題目解析:判斷圖是否聯通和是否有迴路,並查集處理,判斷是否有迴路。統計是否只有只有一個根,判斷是否連通!注意特殊數據0 0 應該輸出Yes!!

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 1000010
int parent[MAX];
int cnt[MAX];
int n,flag;
int max(int x,int y,int z)
{
    if (x<y)
       x=y;
    if (x<z)
       x=z;
    return x;   
}
void UFset()
{
     int i;
     for (i=1;i<=MAX;i++)
     {
         parent[i]=-1;  
         cnt[i]=0;                            
     }
}
int find(int x)
{
    int s;
    for (s=x;parent[s]>0;s=parent[s]);
    while (x!=s)
    {
          int temp=parent[x];
          parent[x]=s;
          x=temp;
    }
    return x;
}
void unio(int R1,int R2)
{
     int r1=find(R1);
     int r2=find(R2);
     if (parent[r1]>parent[r2])
     {
        parent[r1]+=parent[r2];
        parent[r2]=r1;   
     }
     else
     {
        parent[r2]+=parent[r1];
        parent[r1]=r2;     
     }
}
int main()
{
    int ans=0;
    while (1)
    {
          flag=1;
          int u,v,i,j,n=0,tot=0;
          UFset();
          while (1) 
          {
                scanf("%d%d",&u,&v);
                if (u==-1&&v==-1)
                {
                   ans=1;
                   break; 
                } 
                else if (u==0&&v==0)
                {
                   break;  
                }
                if (!cnt[u])
                {
                   cnt[u]=1;
                   n++;
                }
                if (!cnt[v])
                {
                   cnt[v]=1;
                   n++;               
                } 
                if (flag)
                {
                   if (find(u)!=find(v))
                   {
                      unio(u,v);  
                      tot++;                
                   }          
                   else
                   {
                      flag=0;     
                   }
                }     
          }  
          if (ans)
             break;
          if (flag&&tot==n-1||n==0)
             printf("Yes\n");
          else
             printf("No\n"); 
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章