| 节点的连接 | ||||||
|
||||||
| Description | ||||||
|
有N个节点,一开始任意两个节点都没有相连,之后有两种操作: 1: 将 A 节点和 B 节点连接起来。 2: 问从A节点出发可以直接或间接到达的节点数量。 如果 A 节点和 B 节点被连接起来了,那么从A可以到达B,同时从B也可以到达A。 |
||||||
| Input | ||||||
|
第一行是一个整数T,表示有T组测试数据。 对于每组测试数据,第一行是一个整数 n (n<=1000) 代表节点数,一个整数 m (m<=1000)代表操作数,之后有m行,每行代表一种操作。 第一种操作是: 0 A B (1<=A,B<=n),表示将A,B节点连接起来; 第二种操作是: 1 A (1<=A<=n),表示询问从A节点出发可以直接或间接到达的节点的数量。 |
||||||
| Output | ||||||
|
对于每组测试数据,如果是第二种操作,输出一个整数表示答案,每组输出占一行。 |
||||||
| Sample Input | ||||||
|
1 4 5 0 1 1 1 2 0 1 1 1 3 0 3 |
||||||
| Sample Output | ||||||
|
1 2 3 |
||||||
| Source | ||||||
|
2014.11.30新生赛-正式赛
很巧碰到个刚学完的算法题目,立马给他a了 草! #include<iostream>
#include<string.h>
using namespace std;
const int M=50001;
int F[M];
int Find(int x)
{
if(x!=F[x])
return F[x]=Find(F[x]);
}
void union_set(int x,int y)
{
int tx=Find(x);
int ty=Find(y);
if(tx!=ty)
F[tx]=ty;
}
int main()
{
int n,m;
int T;
cin>>T;
while(T--)
{
cin>>n>>m;
int a,b,c;
for(int k=0;k<=n;k++)
F[k]=k;
for(int i=0;i<m;i++)
{
cin>>a;
if(a==1)
{
cin>>b>>c;
union_set(b,c);
}
if(a==0)
{
cin>>b;
int f0=Find(b);
int count=0;
for(int m=1;m<=n;m++)
{
if(f0==Find(m))
count++;
}
cout<<count<<endl;
}
}
}
return 0;
}
|
原文:http://blog.csdn.net/lsgqjh/article/details/45827041