题目:http://acm.hdu.edu.cn/showproblem.php?pid=1232
代码:
#include <iostream>
#include <string.h>
#include <set>
#include<stdio.h>
using namespace std;
int pre[1005];
int n;
int father(int n)
{
int tf = (pre[n] == n) ? n : father(pre[n]);
pre[n] = tf;
return pre[n];
}
void unin(int a, int b)
{
int fa = father(a);
int fb = father(b);
if (fa == fb)
{
return;
}
if (fa < fb)
{
pre[fb] = fa;
}
else
{
pre[fa] = fb;
}
}
void init()
{
for(int i=1;i<=n;i++)
pre[i]=i;
}
int main()
{
int m,x,y;
while(~scanf("%d",&n))
{
if(n==0)
return 0;
scanf("%d",&m);
bool ans[1005];
//memset(pre,0,sizeof(pre));
memset(ans,0,sizeof(ans));
init();
for(int i=0; i<m; i++)
{
scanf("%d%d",&x,&y);
//if(x<=n&&y<=n)
{
unin(x,y);
//unin(y,x);
}
}
/*for(int i=1;i<=n;i++)
{
printf("%d ",pre[i]);
}*/
for(int i=1; i<=n; i++)
{
ans[father(i)]=1; //刚开始是pre[i],无限WA。但为什么是father(i)呢?
}
int ok=0;
for(int i=1; i<=n; i++)
{
if(ans[i]==1)
ok++;
}
cout<<ok-1<<endl;
/*
set<int> rs;
for (int i = 1; i <= n; i++)
{
rs.insert(father(i));
}
printf("%d\n", rs.size() - 1);
*/
}
}
找到了 好像是输入数据的点大于n。即存在 5 1 1 6这种情况。玩心机呀。
所以不能标记pre[i],因为1与6连的时候,pre[1]=0.