题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1325
题目大意:就是判断这个图是不是一棵树,并且说明了树每个节点之间的指向都只有明确的一条。
一直TLE感觉不科学。。。结果看了discuss说只要是负数就结束,并不一定要-1 -1结束。。。好吧跪了,对于结束条件要仔细回到题目中找。。
还有就是这题居然不告诉我数据范围orzzzzzz
又出现了忘记初始化的情况。。。特别是一开始没有写的数组,后来觉得再开一个的话,一定要记得初始化,居然找了好久orzzzz
思路:我的理解就是树的话每一个节点的入度都不能超过1,而且必须要有一个点的入度为0,而且不能环(不过有环的话肯定不能全部满足前面的条件)。
结果发现就跟之前的1272一样是可以用并查集做的。。。我好像是看到是有向图就放弃并查集了orzzzzz果然图样。。
不过也确实并查集判断是否成环,并判断是否只有一个集合(就是一个根节点) 跟之前完全一样嘛···
改天写一下并查集的。。附上别人的博客链接:http://blog.csdn.net/a601025382s/article/details/8196477
没细看,明天自己写一遍。。
贴上没用并查集的代码:
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; #define M 100009 #define INF 0x3f3f3f3f int in[M]; int mark[M]; int main() { int kase = 0; int a,b; while(true) { memset(in,0,sizeof(in)); memset(mark,0,sizeof(mark)); //又漏了这个初始化。。 int ok = 0; int max = -INF; for(;;) { int a,b; scanf("%d %d",&a,&b); mark[a] = 1;mark[b] = 1; if(a>max) max=a; if(b>max) max=b;//找出最大的数据 if(a==0&&b==0) break; if(a<0||b<0) goto out; if(ok) continue; in[b]++; if(in[b]>1) //如果有点入度超过1 ,那么肯定不是树 { ok = 1; continue; } } if(ok) printf("Case %d is not a tree.\n",++kase); else { int ans = 0; for(int i = 1;i <= max;i++) { if(mark[i]) { if(in[i]==0) //判断是否是有一个入度为0的点 ans++; } } if(ans!=1) printf("Case %d is not a tree.\n",++kase); else printf("Case %d is a tree.\n",++kase); } } out: return 0; }