HDU1325

Posted 上进小青年

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU1325相关的知识,希望对你有一定的参考价值。

http://acm.split.hdu.edu.cn/showproblem.php?pid=1325

 

 1 #include<stdio.h>
 2 #include<algorithm>
 3 #include<string.h>
 4 #include<iostream>
 5 using namespace std;
 6 const int M=100010;
 7 int fa[M],vis[M],root[M];
 8 int fin(int x){
 9 return fa[x]==x?fa[x]:fa[x]=fin(fa[x]);
10 }
11 int  unin(int x,int y){
12 return fa[fin(y)]=fin(x);
13 }
14 void init(int n){
15 for(int i=0;i<n;i++){
16     fa[i]=i;
17 }
18 memset(vis,0,sizeof(vis));
19 memset(root,0,sizeof(root));
20 }
21 int main()
22 {
23     int a,b;
24     int cas=1;int flag=1;
25     init(M);
26     while(~scanf("%d%d",&a,&b)){
27         if(a<0||b<0)break;
28 
29 
30         if(a==0&&b==0){
31             int k=0;
32             for(int i=1;i<M;i++){
33                 if(vis[i]&&fa[i]==i){
34                     k++;
35                 }
36                 if(root[i]>1){
37                     flag=0;
38                     break;
39 
40                 }
41 
42             }
43             if(k>1)flag=0;
44             if(flag)printf("Case %d is a tree.\\n",cas++);
45             else printf("Case %d is not a tree.\\n",cas++);
46             flag=1;
47             init(M);
48             continue;
49         }
50         if(a!=b&&fin(a)==fin(b)){
51             flag=0;
52         }
53         else {
54             vis[a]=1;
55             vis[b]=1;
56             root[b]++;
57             unin(a,b);
58         }
59     }
60     return 0;
61 }
View Code

 

对于这道题,主要是看图是否连通,而前面提到过在分析图是否连通的时候我们主要是看有几个根结点,而看有几个根节点又是看有几个fa[i]==i。
至于题目中说到的值可以有一种方法到达每一个节点,则是要看每个节点的入度情况,当出现有一个节点的入度大于1的话肯定就是NO

还可以发现,结点数一定小于边数-1,然后再判断有几个根结点也可以解出这道题,但是我们在这里主要运用并查集的知识

以上是关于HDU1325的主要内容,如果未能解决你的问题,请参考以下文章

HDU 1325 并查集

HDU 1325 有根树的判断

HDU 1325(并查集)

hdu1325

HDU 1325Is It A Tree?

HDU-1325-Is It A Tree?(并查集)