pta ds 并查集 7-2 文件传输 (25分)
当两台计算机双向连通的时候,文件是可以在两台机器间传输的。给定一套计算机网络,请你判断任意两台指定的计算机之间能否传输文件?
输入格式:
首先在第一行给出网络中计算机的总数 N (2),于是我们假设这些计算机从 1 到 N 编号。随后每行输入按以下格式给出:
I c1 c2
其中I
表示在计算机c1
和c2
之间加入连线,使它们连通;或者是
C c1 c2
其中C
表示查询计算机c1
和c2
之间能否传输文件;又或者是
S
这里S
表示输入终止。
输出格式:
对每个C
开头的查询,如果c1
和c2
之间可以传输文件,就在一行中输出"yes",否则输出"no"。当读到终止符时,在一行中输出"The network is connected."如果网络中所有计算机之间都能传输文件;或者输出"There are k
components.",其中k
是网络中连通集的个数。
输入样例 1:
5
C 3 2
I 3 2
C 1 5
I 4 5
I 2 4
C 3 5
S
输出样例 1:
no
no
yes
There are 2 components.
输入样例 2:
5
C 3 2
I 3 2
C 1 5
I 4 5
I 2 4
C 3 5
I 1 3
C 1 5
S
输出样例 2:
no
no
yes
yes
The network is connected.
#include<stdio.h> #include<stdlib.h> typedef int element; typedef int set; void Union(set s[],set r1,set r2){ if(s[r2]<s[r1]){ s[r2] += s[r1]; s[r1] = r2; }else { s[r1] += s[r2]; s[r2] = r1; } } set Find(set s[],element x){ if(s[x]< 0)return x; else return s[x] = Find(s,s[x]); } //int isconnect() int main() { int n; scanf("%d",&n); scanf("\n"); set s[n+1]; for(int i=0;i<=n;i++)s[i] = -1; element e[n+1]; for(int i=0;i<=n;i++)e[i] = i; char op; int in1,in2; while(1){ scanf("%c",&op); if(op=='S')break; scanf("%d %d\n",&in1,&in2); if(op=='C'){ int r1,r2; r1 = Find(s,in1); r2 = Find(s,in2); if(r1 == r2)printf("yes\n"); else printf("no\n"); } else if(op == 'I'){ Union(s,Find(s,in1),Find(s,in2)); } } int k=0; for(int i=1;i<=n;i++)if(s[i]<0)k++; if(k!=1)printf("There are %d components.",k); else printf("The network is connected."); return 0; }