HDU 1272并查集 开始错的很郁闷
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1272
AC代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#define maxn 100001
using namespace std;
int set[maxn],num[maxn];
int find(int x)
{
if(set[x] == x)return x;
return set[x] = find(set[x]);
}
int main()
{
int n,m,pos;
while(scanf("%d%d",&n,&m))
{
if(m==-1 && n==-1)break;
if(m==0 && n==0){puts("Yes");continue;}
memset(num,0,sizeof(num));
num[n] = num[m] = 1;
for(int i =1; i <= maxn; i++)
set[i] = i;
pos = 0;
if(find(n)==find(m))pos = 1;
else
set[find(n)] = find(m);
while(scanf("%d%d",&n,&m),(n&&m))
{
num[n] = num[m] = 1;
if(find(n)==find(m))pos = 1;
else
set[find(n)] = find(m);
}
if(pos){puts("No");continue;} //判断有没有成环
int count = 0; //判断是不是所有的点共有一个根
for(int i = 1; i < maxn; i++)
{
if(num[i] && find(i) == i)
{
count++;
}
}
if(count==1) puts("Yes");
else puts("No");
}
return 0;
} 之前未AC代码:我的思路也写在里面:
#include <iostream>
#include <cstring>
#include <cstdio>
#define maxn 100001
using namespace std;
int set[maxn],num[maxn];
int find(int x)
{
if(set[x] == x)return x;
return set[x] = find(set[x]);
}
int main()
{
int n,m,pos;
while(scanf("%d%d",&n,&m))
{
if(m==-1 && n==-1)break;
if(m==0 && n==0){puts("Yes");continue;}
memset(num,0,sizeof(num));
num[n] = num[m] = 1;
for(int i =1; i <= maxn; i++)
set[i] = i;
pos = 0;
if(find(n)==find(m))pos = 1;
else
set[find(n)] = find(m);
while(scanf("%d%d",&n,&m),(n&&m))
{
num[n] = num[m] = 1;
if(find(n)==find(m))pos = 1;
else
set[find(n)] = find(m);
}
//////////////////////////////只有下面几行不同;
/////这样做的思路是用pos总的来判断要输出Yes还是No
int count = 0;
for(int i = 1; i < maxn; i++)
{
if(count > 1)
{
pos = 1; //如果形成的迷宫不只一个根节点,则pos为1;最后判断就会输出No
continue;
}
if(num[i] && find(i) == i)
{
count++;
}
}
if(pos) puts("No");
else puts("Yes");
}
return 0;
}

浙公网安备 33010602011771号