pta ds 并查集 7-2 文件传输 (25分)

 

 

 

当两台计算机双向连通的时候,文件是可以在两台机器间传输的。给定一套计算机网络,请你判断任意两台指定的计算机之间能否传输文件?

输入格式:

首先在第一行给出网络中计算机的总数 N (2),于是我们假设这些计算机从 1 到 N 编号。随后每行输入按以下格式给出:

I c1 c2  
 

其中I表示在计算机c1c2之间加入连线,使它们连通;或者是

C c1 c2    
 

其中C表示查询计算机c1c2之间能否传输文件;又或者是

S
 

这里S表示输入终止。

输出格式:

对每个C开头的查询,如果c1c2之间可以传输文件,就在一行中输出"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;
}

 

posted on 2020-11-12 15:55  xwwer  阅读(196)  评论(0编辑  收藏  举报