您的位置:首页 > 其它

hdu1272(并查集)

2015-12-25 23:24 323 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1272

思路:

1、判断所有点是否联通,用边数=顶点数-1 来判断

2、判断有没成环,用并查集来判断两个点是否联通,如果已经联通,则会成环。

3、特判 直接读入空图即,a==0&&b==0 输出Yes

代码:

#include<cstdio>
#include<cstring>
const int N=100000+5;
int fa
,vis
;
int flag=1;
int cnt=0; //记录顶点数
int sc=0;// 输出判定问题
void init(){
for(int i=0;i<=N;i++)fa[i]=i;
memset(vis,0,sizeof(vis));
flag=1;
cnt=0;
sc=0;
}
int find(int x){
if(fa[x]!=x)return fa[x]=find(fa[x]);
return fa[x];
}

int main()
{
int a,b;
init();
while(scanf("%d%d",&a,&b)!=EOF)
{
if(a==-1&&b==-1)break;
if(a==0&&b==0){
if(!sc) {printf("Yes\n");init();continue;}
//如果没有输入0 0以外的数的话即为空图,直接输出Yes
int sv=0;
if(!flag) {printf("No\n");init();continue;}
for(int i=1;i<N;i++) if(vis[i]) {
sv++;
}
if(flag&& sv==cnt+1) printf("Yes\n");
else printf("No\n");
init();
continue;
}
if(flag){
sc=1;
vis[a]=1,vis[b]=1;
a=find(a),b=find(b);
if(a!=b)
fa[a]=b,cnt++;
else flag=0;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  并查集