节点的连接 | ||||||
|
||||||
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; } |
时间: 2024-10-13 21:51:15