ACM常用模板——数据结构——并查集
利用并查集来判断无向图的环
模型:给出有向边,判断组合后是否是树
#include<iostream>
using namespace std;
const int maxn=1005;
int fa[maxn],in[maxn],out[maxn],vis[maxn];
int Find(int x)
{
if(fa[x]==x) return x;
return fa[x]=Find(fa[x]);
}
void Merge(int x,int y)
{
x=Find(x);
y=Find(y);
if(x!=y) fa[y]=x;
}
int main()
{
int x,y,Case=1;
cin.sync_with_stdio(false);
while(cin>>x>>y&&x+y>=0)
{
int Max=-1;
if(x+y==0)
{
cout<<"Case "<<Case++<<" is a tree."<<endl;
continue;
}
for(int i=0;i<maxn;i++) fa[i]=i,in[i]=0,out[i]=0,vis[i]=0;
Merge(x,y);
in[y]++;
out[x]++;
vis[x]=1;
vis[y]=1;
Max=max(Max,max(x,y));
while(cin>>x>>y,x+y)
{
Merge(x,y);
in[y]++;
out[x]++;
vis[x]=1;
vis[y]=1;
Max=max(Max,max(x,y));
}
int cnt=0;
for(int i=0;i<=Max;i++)
if(vis[i]&&fa[i]==i) cnt++;
if(cnt!=1)
{
cout<<"Case "<<Case++<<" is not a tree."<<endl;
continue;
}
int cnt1=0,cnt2=0;
for(int i=0;i<=Max;i++)
if(vis[i]&&in[i]==0) cnt1++;
else if(vis[i]&&in[i]>1) cnt2++;
if(cnt1!=1||cnt2>0)
{
cout<<"Case "<<Case++<<" is not a tree."<<endl;
continue;
}
cout<<"Case "<<Case++<<" is a tree."<<endl;
}
return 0;
}
阅读更多
文章标签: acm 算法 数据结构
个人分类: acm
想对作者说点什么? 我来说一句

ACM常用模板 ACM常用模板

2010年07月04日 79KB 下载

acm数据结构内容

2010年04月23日 408KB 下载

ACM 算法 常用模板

2010年07月28日 280B 下载

算法与数据结构并查集

2010年04月23日 100KB 下载

数据结构并查集 查询 快速

2009年05月29日 3KB 下载

ACM常用模板总结ACM常用模板总结

2010年07月18日 119KB 下载

ACM之java速成

2013年12月13日 52KB 下载

没有更多推荐了,返回首页

不良信息举报

ACM常用模板——数据结构——并查集

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭