HDoj 1878オラ回路(並查集+オラ)

3850 ワード

C-並列調査セット+オラhdoj 1878

オーラかいろ


Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u
Submit 
Status
Description
オラ回路とは、ペンを紙面から離さず、図中の各エッジを1回だけ描くことができ、起点に戻ることができる回路のことです.今、オラ回路があるかどうかを尋ねる図を与えます.
 
Input
テスト入力には、いくつかのテスト例が含まれます.各試験例の1行目には、ノード数N(1束.
 
Output
各試験例の出力は1行を占め、オーラ戻り路が存在する場合は1を出力し、そうでない場合は0を出力する. 
 
Sample Input

      
      
      
      
3 3 1 2 1 3 2 3 3 2 1 2 2 3 0

 
Sample Output

      
      
      
      
1 0
: & , 。
, degree[] , , 。
// 

#include <iostream>
#include <cstdio>
#define max 1000+10
using namespace std;

int degree[max];// 
int per[max];
int find(int p)
{
    if(p==per[p])
        return per[p];
    return per[p]=find(per[p]);
}
int merge(int x,int y)
{
    int fx=find(x);
    int fy=find(y);
    if(fx!=fy)
    {
        per[fx]=fy;
    }
}
int main()
{
    int n,m,x,y,f;
    while(scanf("%d",&n)&&n)
    {
        if(n==0)
            break;
        scanf("%d",&m);
        for(int i=1;i<=n;i++)
        {
            per[i]=i;
            degree[i]=0;
        }
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d",&x,&y);
            degree[x]++;
            degree[y]++;
            merge(x,y);
        }
        int ans=0;
        for(int i=1;i<=n;i++)
        {
            if(find(i)==i)
                ans++;
        }
        if(ans>1)
            printf("0
"); else { f=0; for(int i=1;i<=n;i++) { if(degree[i]%2==1) { f=1; break; } } if(f) printf("0
"); else printf("1
"); } } return 0; }