7-2 文件传输(并查集算法)

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

输入格式:
首先在第一行给出网络中计算机的总数 N (2≤N≤10
​4
​​ ),于是我们假设这些计算机从 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.

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<bits/stdc++.h>
using namespace std;
const int N=1e4+5;
int f[N];
int fun(int a){//判断两个数是否在同一集合
    if(f[a]==a){
        return f[a];
    }
    f[a]=fun(f[a]);
    return f[a];
}
void group(int x,int y){//把两个数放在同一集合中
    int fx=fun(x);
    int fy=fun(y);
    if(fx!=fy){
        f[fy]=fx;
    }

}
int main(){
    int k,m,n;
    string c;
    cin>>k;
    for(int i=1;i<=k;i++){
        f[i]=i;
    }
    while(1){
       cin>>c;
        if(c=="S"){
            break;
        }
        cin>>m>>n;
        if(c=="I"){
            group(m,n);
        }
        if(c=="C"){
            if(fun(m)==fun(n)){
                printf("yes\n");
            }else{
                printf("no\n");
            }
        }
    }
    int cnt=0;
    for(int i=1;i<=k;i++){
        if(f[i]==i)
             cnt++;
    }
        if(cnt==1){
           printf("The network is connected.\n");
        }else{
           printf("There are %d components.\n",cnt);
        }

    return 0;
}
    原文作者:犯罪团伙问题
    原文地址: https://blog.csdn.net/weixin_38505045/article/details/80335182
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞