hdu 1325 is it a tree?

网上一搜全是并查集。。 并查集POJ可以水过,HDU就不行了。。

并查集的话:

 1 #include<iostream>

 2 #include<cstdio>

 3 #include<cstring>

 4 using namespace std;

 5 int pre[1005];

 6 bool vis[1005];

 7 int num[1005];

 8 bool flag;

 9 int x,y,icase=1;

10 void init()

11 {

12     for(int i=0;i<=1000;i++)

13         pre[i]=i;

14     memset(num,0,sizeof(num));

15     memset(vis,false,sizeof(vis));

16     flag=false;

17 }

18 int find(int x)

19 {

20     if(pre[x]!=x)

21         pre[x]=find(pre[x]);

22     return pre[x];

23 }

24 void judge()

25 {

26     for(int i=1;i<=1000;i++)

27         if(vis[i]) num[find(i)]++;

28     int key=0;

29     for(int i=1;i<=1000;i++)

30         if(num[i]>1) key++;

31     if(key>1) flag=true;

32 }

33 int main()

34 {

35 //    freopen("in.txt","r",stdin);

36     init();

37     while(1)

38     {

39         scanf("%d%d",&x,&y);

40         if(x<0 && y<0)

41             break;

42         else if(x==0 && y==0)

43         {

44             judge();

45             if(flag)

46                 printf("Case %d is not a tree.\n",icase++);

47             else

48                 printf("Case %d is a tree.\n",icase++);

49             init();

50             continue;

51         }

52         else

53         {

54             vis[x]=vis[y]=true;

55             if(find(x)==find(y) || pre[y]!=y)

56                 flag=true;

57             else

58                 pre[y]=x;

59         }

60     }

61     return 0;

62 }
迪哥代码

 

有个坑是只要是输入两个负数就结束,不一定是-1 -1

判断图是否为树:1.是否为连通图  2.是否有环

因为题目给的是从父亲指向儿子,所以直接判断点的入度就可以了

 1 #include "iostream"

 2 #include "memory.h"

 3 #include "cstdio"

 4 using namespace std;

 5 #define MAXN 1111

 6 int fa[MAXN];

 7 int in_degree[MAXN];

 8 bool c[MAXN];

 9 bool ok;

10 

11 int main()

12 {

13     int a,b,T = 1;

14     while (~scanf("%d%d",&a,&b)) {

15         memset(fa,-1,sizeof(fa));

16         memset(in_degree,0,sizeof(in_degree));

17         memset(c,0,sizeof(c));

18         if (a < 0 && b < 0) break;

19         c[a] = 1;

20         c[b] = 1;

21         in_degree[b]++;

22         while (~scanf("%d%d",&a,&b),a+b) {

23             if (a < 0 && b < 0) return 0;

24             in_degree[b]++;

25             c[a] = 1;

26             c[b] = 1;

27         }

28         int re = 0;

29         int ok = 1;

30         for (int i = 0;i < MAXN; ++ i) if (c[i]){

31             if (in_degree[i] == 0) re ++;

32             if (in_degree[i] > 1) ok = 0;

33         }

34         if (re == 1 && ok) printf("Case %d is a tree.\n",T);

35         else printf("Case %d is not a tree.\n",T);

36         T++;

37     }

38     return 0;

39 }

 

你可能感兴趣的:(tree)