hdu 1878 欧拉回路

判断一个无向图有没有欧拉回路。注意要先判断图有没有连通。我用并查集判断。

46MS:

#include <stdio.h>
#include <string.h>

 

int parent[1001];

 

int f(int x)
{
    int r=x;
    while(parent[r]>=0)
        r=parent[r];
    while(x!=r)
    {
        int t=parent[x];
        parent[x]=r;
        x=t;
    }
    return r;
}
void merge(int x,int y)
{
    int p,q;
    p=f(x);
    q=f(y);
    if(p!=q)
    {
        int n1=parent[p],n2=parent[q];
        //    parent[p]=q;
        if(n1>n2)//-3>-4
        {
            parent[p]=q;
            parent[q]=n1+n2;
        }
        else
        {
            parent[q]=p;
            parent[p]=n1+n2;
        }
    }
}
int main()
{
    int n,i,b,c,m,k,a[1001];
    while(scanf("%d",&n)&&n)
    {
          scanf("%d",&m);
          k=0;
         for(i=1;i<=n;i++)
             parent[i]=-1;
          memset(a,0,sizeof(a));
          for(i=0;i<m;i++)
          {
             scanf("%d %d",&b,&c);
              a[b]++;a[c]++;
              merge(b,c);
          }
          for(i=1;i<=n;i++)
          {
              if(parent[i]<0)
              {
                  k++;
                  if(k>1) break;
              }
              //看有没有孤立点或奇度顶点,有则令b=0
              if(a[i]==0||a[i]%2!=0)
              {
                b=0;
                break;
              }
          }
          //k=1则图连通
          if(b!=0&&k==1)
              printf("1\n");
          else
              printf("0\n");
    }
    return 0;
}

 

posted @ 2010-08-19 11:41  菜到不得鸟  阅读(353)  评论(0)    收藏  举报