PTA 案例4-1.7 文件传输 (查并集)

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

输入格式:
首先在第一行给出网络中计算机的总数 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.

输入样例 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<iostream>
using namespace std;
int f[10010];
int find(int a)
{
    if(f[a]!=a)return f[a]=find(f[a]);//并查集,路径压缩
    return a;
}
int main()
{
    int a,b,c,ans=0;
    char e;
    for(a=0;a<10010;a++)
        f[a]=a;
    cin>>a;
    while(1)
    {
        cin>>e;
        if(e=='C')//查询
        {
            cin>>b>>c;
            if(find(b)==find(c))cout<<"yes"<<endl;
            else cout<<"no"<<endl;
        }
        else if(e=='I')//连接
        {
            cin>>b>>c;
            if(find(b)!=find(c))f[find(b)]=find(c);
        }
        else//结束
        {
            for(b=1;b<=a;b++)
                if(f[b]==b)ans++;
            if(ans==1)cout<<"The network is connected."<<endl;
            else cout<<"There are "<<ans<<" components."<<endl;
            break;
        }
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旧林墨烟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值