
PTA 案例4-1.7 文件传输 (查并集)
发布日期:2021-05-07 10:01:35
浏览次数:23
分类:精选文章
本文共 1174 字,大约阅读时间需要 3 分钟。
当两台计算机双向连通的时候,文件是可以在两台机器间传输的。给定一套计算机网络,请你判断任意两台指定的计算机之间能否传输文件?
输入格式:
首先在第一行给出网络中计算机的总数 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:
5C 3 2I 3 2C 1 5I 4 5I 2 4C 3 5S
输出样例 1:
nonoyesThere are 2 components.
输入样例 2:
5C 3 2I 3 2C 1 5I 4 5I 2 4C 3 5I 1 3C 1 5S
输出样例 2:
nonoyesyesThe network is connected.
解题思路:
查并集基础题,涉及查询、建立,查看集个数代码:
#includeusing 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"< >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."<