博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PTA 中国大学MOOC-陈越、何钦铭-数据结构-2018秋 05-树8 File Transfer (25 分) 并查集
阅读量:3904 次
发布时间:2019-05-23

本文共 2334 字,大约阅读时间需要 7 分钟。

We have a network of computers and a list of bi-directional connections. Each of these connections allows a file transfer from one computer to another. Is it possible to send a file from any computer on the network to any other?

Input Specification:

Each input file contains one test case. For each test case, the first line contains N (2≤N≤10​4​​), the total number of computers in a network. Each computer in the network is then represented by a positive integer between 1 and N. Then in the following lines, the input is given in the format:

I c1 c2

where I stands for inputting a connection between c1 and c2; or

C c1 c2

where C stands for checking if it is possible to transfer files between c1 and c2; or

S

where S stands for stopping this case.

Output Specification:

For each C case, print in one line the word "yes" or "no" if it is possible or impossible to transfer files between c1 and c2, respectively. At the end of each case, print in one line "The network is connected." if there is a path between any pair of computers; or "There are k components." where k is the number of connected components in this network.

Sample Input 1:

5C 3 2I 3 2C 1 5I 4 5I 2 4C 3 5S

Sample Output 1:

nonoyesThere are 2 components.

Sample Input 2:

5C 3 2I 3 2C 1 5I 4 5I 2 4C 3 5I 1 3C 1 5S

Sample Output 2:

nonoyesyesThe network is connected.

 代码如下:

/*并查集的查找与合并一开始初始化集合的个数为n个..然后每两个集合合并就将集合数减一..最后判断集合个数是否为一来判定是否两两相互连接...*/#include 
#include
#include
#include
using namespace std;const int maxn=10005;int n;int a[maxn];int num;char op[5];void init(){ num=n; for (int i=1;i<=n;i++) { a[i]=i; }}int Find(int x){ if(a[x]==x) return x; else return a[x]=Find(a[x]);}void unit(int x,int y){ int px=Find(x); int py=Find(y); if(px!=py) { a[px]=py; num--; }}int main(){ scanf("%d",&n); init(); while (scanf("%s",op)&&op[0]!='S') { int x,y; scanf("%d%d",&x,&y); if(op[0]=='I') { unit(x,y); } else { if(Find(x)==Find(y)) { printf("yes\n"); } else printf("no\n"); } } if(num==1) printf("The network is connected.\n"); else printf("There are %d components.\n",num); return 0;}

 

转载地址:http://gxaen.baihongyu.com/

你可能感兴趣的文章
模仿Toast实现提示框
查看>>
Bitmap优化
查看>>
Android: Bitmap与DrawAble与byte[]与InputStream之间的转换
查看>>
java-设计模式-创建模式-建造者模式builder
查看>>
java-设计模式-创建模式-工厂模式factory
查看>>
java-设计模式-创建模式-观察者模式observer
查看>>
原子性、可见性以及有序性
查看>>
Session的生命周期
查看>>
死锁实例
查看>>
生产者消费者实例
查看>>
java中数组定义String a[]和String[] a有什么区别?
查看>>
Java权限访问修饰符 亲测总结
查看>>
Jsp与servlet的区别
查看>>
struct spring hibernate辨析
查看>>
Spring和SpringMVC的区别
查看>>
java程序与操作系统API的关系
查看>>
用手机连接电脑的360免费WiFi(电脑自带的无线网卡启动AP模式)
查看>>
一个外网IP如何能映射两台机子的相同端口(NAT)
查看>>
尾递归笔记
查看>>
剑指Offer
查看>>