HDU-1325 Is It A Tree?

27 篇文章 0 订阅
18 篇文章 0 订阅

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

思路:DFS/并查集  对比AC的代码交了40多遍,心态搞炸,结果发现是输入u<0,v<0时退出而不是==-1,ヽ(`Д´)ノ︵ ┻━┻ ┻━┻

思路一:DFS,首先判断是否只有一个根节点,再DFS来判断是否有环路,以及有多个块

思路二:并查集,1.判断环路Find(u)==Find(v),2.以及父节点只有一个pre[v]!=v。3,节点个数=边数+1即可

Code 1:

#include<iostream>
#include<cstring>
#include<set>
using namespace std;
 
const int MAX_N=1e5+5;
int n;
set<int> iset;
int pre[MAX_N];

int Find(int x){
	if(pre[x]!=x)	pre[x]=Find(pre[x]);
	return pre[x];
}
void Union(int a,int b){
	pre[Find(b)]=Find(a);
}
int main()
{
	ios::sync_with_stdio(false);
	int u,v,t=1,ss;
	while(cin>>u>>v){
		if(u<0&&v<0)	break;
		if(!u&&!v){
			cout<<"Case "<<t++<<" is a tree."<<endl;
			continue;
		}
		ss=1;
		iset.clear();
		for(int i=0;i<MAX_N;++i)
			pre[i]=i;
		int p=0;
		iset.insert(u);	iset.insert(v);
		Union(u,v);
		while(cin>>u>>v){
			if(!u&&!v)	break;
			++ss;
			iset.insert(u);	iset.insert(v);
			if(pre[v]!=v||Find(u)==Find(v))	p=-1;
			Union(u,v);
		}
		if(ss+1!=iset.size())	p=-1;
		cout<<"Case "<<t++;
		if(p==-1)	cout<<" is not a tree."<<endl;
		else	cout<<" is a tree."<<endl;
	}
	
	return 0;
}

Code 2:

#include<iostream>
#include<cstring>
#include<vector>
#include<set>
using namespace std;
 
const int MAX_N=10055;
int n,p;
set<int> iset;
vector<int> e[MAX_N];
bool d[MAX_N],boo[MAX_N];
 
void DFS(int u,int pre);
int main()
{
	ios::sync_with_stdio(false);
	int u,v,t=1;
	while(cin>>u>>v){
		iset.clear();
		memset(e,0,sizeof(e));
		memset(d,0,sizeof(d));
		memset(boo,0,sizeof(boo));
		if(u==-1&&v==-1)	break;
		do{
			if(!u&&!v)	break;
			e[u].push_back(v);
			iset.insert(u);	iset.insert(v);
			boo[u]=boo[v]=d[v]=true;
			cin>>u>>v;
		}while(u&&v);
		p=0;
		set<int>::iterator c=iset.begin();
		for(;c!=iset.end();++c)
			if(!d[*c]){
				if(p){
					p=-1;	break;
				}else	p=*c;
			}
		if(p!=-1){
			boo[p]=false;
			DFS(p,-1);
			set<int>::iterator c=iset.begin();
			for(;c!=iset.end();++c)
				if(boo[*c]){
					p=-1;	break;
				}
		}
		cout<<"Case "<<t++;
		if(p==-1)	cout<<" is not a tree."<<endl;
		else	cout<<" is a tree."<<endl;
	}
	
	return 0;
}

void DFS(int u,int pre)
{
	if(p==-1)	return;
	vector<int>::iterator v=e[u].begin();
	for(;v!=e[u].end();++v)
		if(*v!=pre){
			if(!boo[*v]){
				p=-1;	break;
			}
			boo[*v]=false;
			DFS(*v,u);
		}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值