题目大意:将多个电脑通过网线连接起来,不断查询2台电脑之间是否连通。

问题来源:中国大学mooc

05-树8 File Transfer (25 分)

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 kcomponents." where k is the number of connected components in this network.

Sample Input 1:

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

Sample Output 1:

no
no
yes
There are 2 components.

Sample Input 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

Sample Output 2:

no
no
yes
yes
The network is connected.

思路: 并查集的题目,首先知道如何表示并查集的数据结构:

typedef struct{
  int data;
  int parent;
}SetType[MaxSize];
本题可以进行优化:只用一个数组  int SetType[MaxSize]表示即可,数组下标表示计算机的序号,SetType[index]表示为他的父节点,就是连通节点的序号。
并查集的Find  和union函数如下:
int Find(SetType S[],int x){
int i;
for(i=;i<MaxSize&&S[i].data!=x;i++); //查找的时间复杂度n
if(i>MaxSize)return -;
for(;S[i].parent>=;i=S[i].parent);
return i; //找到X所属集合,返回树根结点在数组S中的下标
} void Union(SetType S[],int x1,int x2){
int root1,root2;
root1=find(S,x1);
root2=find(S,x2);
if(root1!=root2)S[root2]=root1; }

优化后的Find和路径压缩函数如下:

#define Maxitem 10000

int S[Maxitem];
//采用路径压缩,尾递归寻找他的根结点
int find(int x){
if(S[x]<)return x;
////先找到根; 把根变成 X 的父结点; 再返回根。
else return S[x]=find(S[x]);
}
//按秩归并,将根结点数量少的树连接到根结点多的树,这里用S[root]表示根结点
//S[root]为负数,绝对值为节点数
void Union(int root1,int root2){
if(S[root1]>S[root2]){
S[root2]+=S[root1];
S[root1]=root2;
}else {
S[root1]+=S[root2];
S[root2]=root1;
}
}

程序框架:

最终代码如下:

#include<cstdio>
#define Maxitem 10000 int S[Maxitem];
//采用路径压缩,尾递归寻找他的根结点
int find(int x){
if(S[x]<)return x;
////先找到根; 把根变成 X 的父结点; 再返回根。
else return S[x]=find(S[x]);
}
//按秩归并,将根结点数量少的树连接到根结点多的树,这里用S[root]表示根结点
//S[root]为负数,绝对值为节点数
void Union(int root1,int root2){
if(S[root1]>S[root2]){
S[root2]+=S[root1];
S[root1]=root2;
}else {
S[root1]+=S[root2];
S[root2]=root1;
}
}
void initialzation(int n){
for(int i=;i<n;i++){
S[i]=-;
}
}
void Input_connection(){
int u,v,root1,root2;
scanf("%d %d",&u,&v);
getchar();
root1=find(u-);
root2=find(v-);
Union(root1,root2);
}
void Check_connection(){
int u,v,root1,root2;
scanf("%d %d",&u,&v);
getchar();
root1=find(u-);
root2=find(v-);
if(root1==root2)printf("yes\n");
else printf("no\n");
}
void Check_networks(int n){
int count=;
for(int i=;i<n;i++)
if(S[i]<)count++;
if(count==)printf("The network is connected.\n");
else printf("There are %d components.\n",count);
}
int main(){
char in;
int n;
scanf("%d",&n);
initialzation(n);
do{
scanf("%c",&in);
switch(in){
case'I':Input_connection();break;
case'C':Check_connection();break;
case'S':Check_networks(n);break;
}
}while(in!='S');
return ;
}
 

File Transfer(并查集)的更多相关文章

  1. 05-树8 File Transfer(25 point(s)) 【并查集】

    05-树8 File Transfer(25 point(s)) We have a network of computers and a list of bi-directional connect ...

  2. 04-树5. File Transfer--并查集

    对于一个集合常见的操作有:判断一个元素是否属于一个集合:合并两个集合等等.而并查集是处理一些不相交集合(Disjoint Sets)的合并及查询问题的有利工具. 并查集是利用树结构实现的.一个集合用一 ...

  3. Uva 12361 File Retrieval 后缀数组+并查集

    题意:有F个单词,1 <= F <=60 , 长度<=10^4, 每次可以输入一个字符串,所有包含该字串的单词会形成一个集合. 问最多能形成多少个不同的集合.集合不能为空. 分析:用 ...

  4. 05-树8 File Transfer

    并查集 简单并查集:输入N,代表有编号为1.2.3……N电脑.下标从1开始.初始化为-1.合并后根为负数,负数代表根,其绝对值代表个数. We have a network of computers ...

  5. pat04-树5. File Transfer (25)

    04-树5. File Transfer (25) 时间限制 150 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue We have ...

  6. PTA 05-树8 File Transfer (25分)

    题目地址 https://pta.patest.cn/pta/test/16/exam/4/question/670 5-8 File Transfer   (25分) We have a netwo ...

  7. *HDU2473 并查集

    Junk-Mail Filter Time Limit: 15000/8000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  8. [并查集] POJ 1611 The Suspects

    The Suspects Time Limit: 1000MS   Memory Limit: 20000K Total Submissions: 35206   Accepted: 17097 De ...

  9. PAT 5-8 File Transfer (25分)

    We have a network of computers and a list of bi-directional connections. Each of these connections a ...

随机推荐

  1. Python 基础 函数

    python 什么是函数 Python不但能非常灵活地定义函数,而且本身内置了很多有用的函数,可以直接调用.   python 函数的调用 Python内置了很多有用的函数,我们可以直接调用. 要调用 ...

  2. 用js实现导出功能将html中的table导出为excel

    /** * 描述:导出表格对应的excel文件 * 时间:2018-03-29 * 作者:任恩远 * 调用示例: * onclick = "tableToExcel(tableId,file ...

  3. 第五章 C程序结构

    一.数值类型 1.实数常量的表示:3.5(双精度),3.5f(单精度),3.5L(长双精度) 2.整数常量:char字符常量(‘a’,‘b’,‘0’)当做一个整型常量参加运算 3.数字字符与英文字母字 ...

  4. 我们比较常见的PHP实现openSug.js参数调试

    这是一款利PHP对百度搜索下拉框提示免费代码实现参数配置调试的程序源代码. 由想要对网站进行搜索下拉调试的站长朋友们进行方便.快速的效果演示,具体参考下面的PHP代码. 如何使用? 请新建一份PHP文 ...

  5. tp5 的nginx配置

    下面简单说明一下tp5运行在nginx上的配置. 原文地址:小时刻个人博客>http://small.aiweimeng.top/index.php/archives/tp5_nginx.htm ...

  6. linux用户及文件管理

    帮助命令 whatis 命令  #显示命令的简短功能 man    命令  #查看手册页和命令描述 命令--help    #适用于外部命令 help    命令  #适用于内部命令 type 命令  ...

  7. 04.flume+kafka环境搭建

    1.flume下载 安装 测试 1.1 官网下载,通过xshell从winser2012传到cent0s的/opt/flume目录中,使用rz命令 1.2 解压安装 tar -zxvf apache- ...

  8. urllib库使用方法1 request

    urllib是可以模仿浏览器发送请求的库,Python自带 Python3中urllib分为:urllib.request和urllib.parse import urllib.request url ...

  9. 浏览器窗口输入网址后发生的一段事情(http完整请求)

    1.DNS查询得到IP 输入的是域名,需要进行dns解析成IP,大致流程: 如果浏览器有缓存,直接使用浏览器缓存,否则使用本机缓存,再没有的话就是用host 如果本地没有,就向dns域名服务器查询(当 ...

  10. Java学习笔记三十一:Java 包(package)

    Java 包(package) 一:包的作用: 如果我们在使用eclipse等工具创建Java工程的时候,经常会创建包,那么,这个包是什么呢. 为了更好地组织类,Java 提供了包机制,用于区别类名的 ...