hdu1272(并查集)
题目就不复制过来了,这道题有个坑就是当一组输入数据只有0 0时应该输出Yes
#include <iostream>
#include <stdio.h>
#include <memory.h>
using namespace std;
int parent[100001];
bool vis[100001];
void Init()
{
for(int i=0;i<=100000;i++)
{
parent[i]=i;
}
}
int findP(int x)
{
if(parent[x]==x)
return x;
else
{
return parent[x]=findP(parent[x]);
}
}
void Union(int x,int y)
{
int xp=findP(x),yp=findP(y);
parent[yp]=xp;
}
bool isallLinked()//检查是否所有出现的点都已经联通
{
int p,i;
for(i=1;i<100001;i++)
{
if(vis[i])
{
p=findP(i);break;
}
}
for(;i<100001;i++)
{
if(vis[i]&&p!=findP(i))
return false;
}
return true;
}
int main()
{
//freopen("in.in","r",stdin);
int N,M;
Init();
memset(vis,0,sizeof(vis));
while(scanf("%d%d",&N,&M)&&N!=-1)
{
bool yes=true;
vis[N]=vis[M]=true;
Union(N,M);
while(!(N==0&&M==0)&&scanf("%d%d",&N,&M)&&!(N==0&&M==0))
{
vis[N]=vis[M]=true;
if(findP(N)==findP(M))
{
yes=false;
}
Union(N,M);
}
if(yes&&isallLinked())
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
Init();
memset(vis,0,sizeof(vis));
}
return 0;
}
浙公网安备 33010602011771号