利用並查集判斷一個有向圖是否成樹


hdu 1325

此題與hdu 1272類似。

但此題需注意以下幾點:

1.當輸入兩個負數時退出,不是當輸出-1 -1 (這點不注意將一直超時T_T)

2.對樹的判斷除了不成環,還需注意一個問題:此圖為有向圖:當b的根不是他自己或a時,b 這個節點有兩個跟,同樣不成數。

    if(f1 == f2 || f2 != b)
        flag = 1;

 

 1 #include<stdio.h>
 2 #include<string.h>
 3 #define N 110000
 4 int f[N],vis[N];
 5 int flag = 0;
 6 int Maxx = 0;
 7 int num = 1;
 8 int Max(int a,int b)
 9 {
10     return a>b?a:b;
11 }
12 void star1()
13 {
14     int i;
15     for(i = 0;i < N;i ++)
16     {
17         f[i] = i;
18     }
19     memset(vis,0,sizeof(vis));
20     flag = 0;
21     Maxx = 0;
22 }
23 int root(int i)
24 {
25     if(f[i] == i)
26         return i;
27     else
28         return root(f[i]);
29 }
30 void U(int a,int b)
31 {
32     int f1,f2;
33     f1 = root(a);
34     f2 = root(b);
35     if(f1!= f2)
36         f[f2] = f1;
37     if(f1 == f2 || f2 != b)
38         flag = 1;
39 }
40 int main()
41 {
42     int n,m,i,j,k;
43     int a,b;
44     star1();
45     while(~scanf("%d %d",&a,&b)&& a>=0 && b>=0)
46     {
47         if(a==0 && b ==0)
48         {
49             k = 0;
50             for(i = 1;i <= Maxx;i ++)
51             {
52                 if(vis[i] && f[i] == i)
53                     k ++;
54             }
55             if(k <= 1 && flag == 0)
56             {
57                 printf("Case %d is a tree.\n",num++);
58             }
59             else
60             {
61                 printf("Case %d is not a tree.\n",num++);
62             }
63             star1();
64         }
65         else
66         {
67             Maxx = Max(Maxx,Max(a,b));
68             vis[a] = vis[b] = 1;
69             U(a,b);
70         }
71     }
72     return 0;
73 }
c++

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM