poj1308 Is is a tree?

题目链接:https://vjudge.net/problem/POJ-1308

题意:给定一些有向边,判断能否形成一棵树

其实有向边就可以看成无向边,然后就是判环和判连通的问题了,可以用并查集。输入数据不一定是从1到n,所以加一个简单的离散化,这个在noi2015d1t1也用到了。其他也没什么注意点

#include<cstdio>
#include<set>
using namespace std;

const int maxn=100000+10;
int n,i,x,y,f,num,c;
int par[maxn],a[maxn];

int find(int x){return par[x]==x?x:par[x]=find(par[x]);}

int main(){
	scanf("%d%d",&x,&y);
	c=0; set<int> st;
	while (x!=-1&&y!=-1){
	  num=0; st.clear(); c++; f=0;
	  for (i=1;i<=maxn;i++) {
	  	par[i]=i;a[i]=0;
	  }
	  while (x>0&&y>0){
	  	if (a[x]==0) a[x]=(++num); if (a[y]==0) a[y]=(++num);
	  	int xx=find(par[a[x]]); int yy=find(par[a[y]]);
	  	if (xx==yy) f=1; else par[xx]=yy;
	  	scanf("%d%d",&x,&y);
	  }
	  for (i=1;i<=num;i++) par[i]=find(par[i]);
	  for (i=1;i<=num;i++) st.insert(par[i]);
	  if (st.size()>1) f=1;
	  if (f==0) printf("Case %d is a tree.\n",c);
	  else printf("Case %d is not a tree.\n",c);
	  scanf("%d%d",&x,&y);
	}
	return 0;
}
posted @ 2020-08-03 23:50  coastal_taipan  阅读(76)  评论(0)    收藏  举报