检查网络(并查集)
2016-01-19 09:38
453 查看
题目要求:
给定一个计算机网络以及机器的双向连线列表,每一条连线允许两端的计算机进行直接的文件传输,其他计算机间若存在一条连通路径,也可以进行间接的文件传输,请写程序判断,任意指定两台计算机,它们之间是否可以进行文件传输?
输入要求:
输入由若干组测试数据组成。对于每一组测试数据,第1行包含一个整数N(<=10000),即网络中计算机的总台数,因而每台计算机可用1到N之间的一个正数表示。接下来的几行输入格式为I C1 C2或者C C1 C2或S,其中C1和C2是两台计算机的序号,I表示在C1和C2间输入一条连线,C表示检查C1和C2间是否可以传输文件,S表示该组测试结束。
当N为0时,表示全部测试结束,不要对该数据做任何处理。
输出要求:
对每一组C开头的数据,检查C1和C2间是否可以传输文件,若可以,则在一行中输出“yes”,否则输出“no”。
当读到S时,检查整个网络。若网络中任意两机器间都可以传输文件,则在一行中输出“The network is connected.”,否则输出“There are k components.”其中k是网络中连通集的个数。
给定一个计算机网络以及机器的双向连线列表,每一条连线允许两端的计算机进行直接的文件传输,其他计算机间若存在一条连通路径,也可以进行间接的文件传输,请写程序判断,任意指定两台计算机,它们之间是否可以进行文件传输?
输入要求:
输入由若干组测试数据组成。对于每一组测试数据,第1行包含一个整数N(<=10000),即网络中计算机的总台数,因而每台计算机可用1到N之间的一个正数表示。接下来的几行输入格式为I C1 C2或者C C1 C2或S,其中C1和C2是两台计算机的序号,I表示在C1和C2间输入一条连线,C表示检查C1和C2间是否可以传输文件,S表示该组测试结束。
当N为0时,表示全部测试结束,不要对该数据做任何处理。
输出要求:
对每一组C开头的数据,检查C1和C2间是否可以传输文件,若可以,则在一行中输出“yes”,否则输出“no”。
当读到S时,检查整个网络。若网络中任意两机器间都可以传输文件,则在一行中输出“The network is connected.”,否则输出“There are k components.”其中k是网络中连通集的个数。
#include <iostream> using namespace std; int a[10001],b[10001]; int find(int x) { if(x==a[x]) return x; else return(find(a[x])); } void unio(int r1,int r2)//合并时进行路径压缩 { if(b[r1]>=b[r2]) //r1所在连通集长度大于r2所在连通集 { b[r1]+=b[r2]; a[r2]=r1; } else { b[r2]+=b[r1]; a[r1]=r2; } } int main() { int n,u,v,r1,r2; char c; cout<<"请输入网络中计算机的总台数:"<<endl; while(cin>>n) { if(n==0) break; for(int i=1; i<=n; i++) //初始化 { a[i]=i; b[i]=1; } cout<<"请输入操作:"<<endl; while(cin>>c) { if(c=='I')//为两台电脑之间添加连接 { cin>>u>>v; r1=find(u); r2=find(v); if(r1!=r2) //u和v不连通时 { unio(r1,r2); } cout<<"请输入操作:"<<endl; } else if(c=='C')//查询两台机器之间是否连通 { cin>>u>>v; r1=find(u); r2=find(v); if(r1!=r2) cout<<"no"<<endl; else cout<<"yes"<<endl; cout<<"请输入操作:"<<endl; } else if(c=='S')//检查整个网络并结束该组测试 { int count=0; for(int i=1; i<=n; i++) if(a[i]==i) count++; if(count==1)//如果整个网络全部连通 cout<<"The network is connected."<<endl; else cout<<"There are "<<count<<" components."<<endl; cout<<endl; cout<<"请输入网络中计算机的总台数:"<<endl; break; } else { cout<<"输入错误,请重新输入操作."<<endl; } } } return 0; }
相关文章推荐
- 使用chrome浏览器查看当前网页的http头
- HttpWatch工具简介及使用技巧
- Win7下添加网络适配器
- android 检查网络连接状态实现步骤
- 缓存网络数据--Rx和数据库
- 爬虫 - 开发网络爬虫应该怎样选择爬虫框架
- Android编程获取网络时间实例分析
- Java的Socket网络编程基础知识入门教程
- Xcode7 使用NSURLRequest进行HTTP请求出错解决方案
- http servlet服务器和android客户端(二)第一个android客户端
- 使用常见的网络命令查看当前网络状态——Mac OS X篇
- iOS网络-AFNetworking检测网络状态
- Atitit. servlet 与 IHttpHandler ashx listen 和HttpModule的区别与联系 原理理论 架构设计 实现机制 java php c#.net js javascript c++ python
- Atitit. servlet 与 IHttpHandler ashx listen 和HttpModule的区别与联系 原理理论 架构设计 实现机制 java php c#.net j
- Atitit. servlet 与 IHttpHandler ashx listen 和HttpModule的区别与联系 原理理论 架构设计 实现机制 java php c#.net j
- 安装mysql时出现HTTP 500 内部服务…
- 厦门巨游网络科技有限公司(HOTPOWER)承接游戏UI外包
- GCD group在多个网络请求的响应之前就已经执行
- mac分享wifi,让手机使用电脑的网络
- iOS网络-AFNetworking序列化