题目:
4 2 1 3 4 3 3 3 1 2 1 3 2 3 5 2 1 2 3 5 999 0 0
1 0 2 998 <div style='font-family:Times New Roman;font-size:14px;background-color:F4FBFF;border:#B7CBFF 1px dashed;padding:6px'><div style='font-family:Arial;font-weight:bold;color:#7CA9ED;border-bottom:#B7CBFF 1px dashed'><i>Hint</i></div>Hint</div> Huge input, scanf is recommended.
想法:
这题考验的是并查集。。
给一条边然后把两个点加入到集合中,以后的每条边得点如果能在前面找到,就加入那个集合,否则自创一个集合,最后总计一共有多少个集合,把总数减一即可。。
代码:
#include <iostream>
#include <cstdio>
using namespace std;
int f[1001];
int find(int a)
{
if(a==f[a])
{
return a;
}
return f[a] = find(f[a]);
}
void join(int a,int b)
{
int fa = find(a);
int fb = find(b);
if(fa != fb)
{
f[fa]=fb;
}
}
int main()
{
int n,i,m;
while(cin>>n&&n!=0)
{
cin>>m;
for(i=1;i<=n;++i)
{
f[i] = i;
}
for(i=1;i<=m;++i)
{
int a,b;
cin>>a>>b;
join(a,b);
}
int cnt=0;
for(i=1;i<=n;++i)
{
if(f[i] == i)
{
cnt++;
}
}
cnt=cnt-1;
cout<<cnt<<endl;
}
return 0;
}