题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=17713
题意:给定一些有向边,判断它是不是树
思路:边树edge和点数node满足edge = node-1并且没有多条边指向一个结点则为树。
遗憾的是不仅仅如此,因为空树也算树。。。。。。一样的题还有HDU1325,不过不用考虑空树情况就能过
源码:
//#include <cstdio>
//#include <cstring>
//#include <cmath>
//#include <iostream>
//using namespace std;
//int cas;
//int f,l,flag;
//int const MAXN = 100000+5000;
//int fa[MAXN];
//void init()
//{
// for(int i=1; i<MAXN; i++)
// fa[i] = i;
//}
//bool fi(int now,int det)
//{
// if(fa[now]==det)
// return true;
// if(fa[now]==now)
// return false;
// return fi(fa[now],det);
//}
//bool findroot(int now)
//{
// if(fa[now]==now)
// return now;
// return findroot(fa[now]);
//}
//int main()
//{
// cas = 0;
// init();
// while(scanf("%d%d",&f,&l)!=EOF && f!=-1){
// if(f==0 && l==0){
// if(flag==0)
// printf("Case %d is a tree.\n",++cas);
// else
// printf("Case %d is not a tree.\n",++cas);
// init();
// flag = 0;
// }
// else{
// if(fa[l]==l){
// fa[l] = f;
// if(fi(f,l))
// flag = 1;
// }
// else if(!fi(l,f)){
// flag = 1;
// }
// else{
// fa[l] = f;
// if(fi(f,l))
// flag = 1;
// }
// }
// }
// return 0;
//}
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
int const MAXN = 1000000;
int mark[MAXN];
int en[MAXN];
int edge,node,een;
int f,l;
bool fi(int a,int c[],int num)
{
for(int i=0; i<num; i++)
if(c[i]==a)
return true;
return false;
}
int main()
{
int cas = 0;
int flag = 0;
een = 0;
while(scanf("%d%d", &f, &l)!=EOF && f!=-1 && l!=-1){
if(f==0 && l==0){
// int i;
// for(i=0;i<node; i++)
// printf("%d ",mark[i]);
// printf("\n");
// for(i=0; i<een; i++)
// printf("%d ",en[i]);
// printf("\n");
// printf("flag = %d, edge = %d, node = %d\n",flag,edge,node);
if(edge ==0 && node==0)
printf("Case %d is a tree.\n",++cas);
else if(edge==node-1 && !flag)
printf("Case %d is a tree.\n",++cas);
else
printf("Case %d is not a tree.\n",++cas);
edge = node = flag = een = 0;
memset(mark,0,sizeof(mark));
}
else{
if(fi(f,mark,node)==0){
mark[node++] = f;
// node++;
}
if(fi(l,mark,node)==0){
mark[node++] = l;
}
if(fi(l,en,een)!=0)
flag = 1;
en[een++] = l;
edge++;
}
}
return 0;
}