您的位置:首页 > 编程语言 > C语言/C++

HDOJ1272并查集加判断森林

2015-08-05 21:48 274 查看
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <iostream>
using namespace std;

#define MAX_N  100005
static int par[MAX_N];

static void init()
{
for(int i=0;i<MAX_N;++i)
par[i] = 0;
}

static int getParent(int u)
{
if (par[u]!=u)
par[u] = getParent(par[u]);
return par[u];
}

static void merge(int u,int v)
{
int p1 = getParent(u);
int p2 = getParent(v);
if (p1==p2)return;
par[p1] = p2;
}

static bool same(int u,int v)
{
int p1 = getParent(u);
int p2 = getParent(v);
if (p1==p2)return true;
return false;
}

int main()
{
int u,v;
int cnt = 0;
while(true)
{
scanf("%d %d",&u,&v);
if (u==-1&&v==-1)
break;
init();
bool flag = false;
cnt = 0;
if (u==0&&v==0)
{
flag = false;
printf("Yes\n");
continue;
}
else
{
par[u] = u;
par[v] = v;
merge(u,v);
while(scanf("%d %d",&u,&v)&&u&&v)
{
if (par[u]==0)
par[u] = u;
if (par[v]==0)
par[v] = v;
if (same(u,v))
flag = true;
merge(u,v);
}
}
int k=0;
//统计是否是森林
for (int i=1;i<MAX_N;++i)
if (par[i]==i)
k++;

if (k>1||flag)
printf("No\n");
else
printf("Yes\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  algorithm 算法 c++