hdu (1878) 欧拉回路 (the usage of Disjoint set)

problem link adress:http://acm.hdu.edu.cn/showproblem.php?pid=1878  

 

欧拉回路的判定:

并查集(Disjoint set)去年暑假学习的,唉我这个败家子到现在忘得差不多了,看以前的blog才恢复的功力。

。。。。。。囧,欧拉回路的判定,还是参考别人的思路,好吧!。。。。。。。。。。

 

判定条件:1   每个节点数必须是2 

              2   判断是否构成了回路,可用并查集来判断,也就是所有点在一个集合里

Run ID Submit Time Judge Status Pro.ID Exe.Time Exe.Memory Code Len. Language  
7680509 2013-03-03 11:39:46 Accepted 1878 156MS 308K 880 B C++ heat_nan

 

  

 

 

hdu (1878) 欧拉回路 (the usage of Disjoint set) View Code
 1 #include<iostream>

 2 #include<cstring>

 3 #include<cstdio>

 4 using namespace std;

 5 int f[1005],count[1005];

 6 int n,m;

 7 // step 1: make a sequence 

 8 void sequence(int x)

 9 {

10     int i;

11     for(i=1;i<=x;i++)

12         f[i]=i;

13 }

14 // step 2: find its father

15 int find(int x)

16 {

17     if(x!=f[x])

18         f[x]=find(f[x]);

19     return f[x];

20 }

21 // step 3: Union 

22 void Union(int x,int y)

23 {

24     int min,max;

25     x=find(x);

26     y=find(y);

27     if(x!=y)  // notice here

28     {

29         min=x<y?x:y;

30         max=x>y?x:y;

31         f[max]=min;// 让编号较大的节点的值指向编号较小的值

32     }

33 }

34 int main()

35 {

36     int i,a,b,flag;

37     while(cin>>n)

38     {

39         if(n==0) break;

40         memset(count,0,sizeof(count));

41         sequence(n);

42         flag=1;

43         cin>>m;

44         for(i=0;i<m;i++)

45         {

46             cin>>a>>b;

47             count[a]++;count[b]++;

48             Union(a,b);

49         }

50         for(i=1;i<=n;i++)// 让所有节点的值为1

51             find(i);

52         for(i=1;i<=n;i++)// 判断是否组成回路

53         {

54             if(f[i]!=1)

55             {flag=0;break;}

56         }

57         for(i=1;i<=n;i++)// 判断每个节点的次数是否为2

58         {

59             if(count[i]!=2)

60             {flag=0;break;}

61         }

62         if(flag)

63             cout<<"1"<<endl;

64         else

65             cout<<"0"<<endl;

66     }

67     return 0;

68 }

 

你可能感兴趣的:(JOIN)