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<=104), 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." wherek 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. 这题典型的是一道并查树的题。思路也非常简单,课件上也有现成。但是这道题直接用课本上的unite方法的话会超时。改进的办法有两个:1.unite时判断两个集合哪个集合的元素多,然后把元素少的那个集合并到大的里面,即直接把元素少的集合的根挂到另一个集合的根上。2.unite时,也是先判断哪个元素多,然后把元素少的那个集合的每一个元素都挂到元素多的那个集合的根上,这样做的话可以保证每个集合的高度只能是2,减少了find操作的耗时,但是会增加unite操作调整元素的时间。亲测用两种方法都能AC,下面给出两种方法的AC代码。
 #include<iostream>
#include"stdio.h"
using namespace std; int* a; void unite(int x1,int x2)
{
int root1 = x1-;
while (a[root1]>=)
root1=a[root1];
int root2 = x2-;
while (a[root2]>=)
root2=a[root2]; if ((a[root1]) <= (a[root2])) //root1的集合较大
{
a[root1] += a[root2];
a[root2] = root1;
}
else
{
a[root2] += a[root1];
a[root1] = root2;
}
} void judge(int x1,int x2)
{
int root1 = x1-;
int root2 = x2-;
while (a[root1]>=)
root1 = a[root1];
while (a[root2]>=)
root2 = a[root2];
if ( root1 == root2 )
printf("yes\n");
else
printf("no\n");
} int main()
{
int N=;
cin >> N;
a = new int [N]; for (int i=;i<N;i++)
{
a[i] = -;
} char operation='a';
int c1=,c2=; cin >> operation;
while (operation != 'S')
{
cin >> c1 >> c2;
if (operation == 'I')
{
unite(c1,c2);
}
else if (operation == 'C')
{
judge(c1,c2);
}
cin >> operation;
}
int component=;
for (int i=;i<N;i++)
if (a[i] < )
++component; if (component == )
cout << "The network is connected." << endl;
else
cout << "There are " << component << " components." << endl; return ;
}
 #include<iostream>
#include<vector>
#include"stdio.h"
using namespace std; struct PC
{
int data;
int parent;
vector<int> children;//若为根节点,则此容器放的是整个集合的元素值
};
PC* a; int find(int x) //查找x属于哪个集合,返回根节点的下标
{
vector<int> vec;
for (;a[x-].parent >=; x=a[x-].parent+);
return x;
} void unite(int x1,int x2)
{
int root1 = find(x1);
int root2 = find(x2);
if (-(a[root1-].parent) >= -(a[root2-].parent)) //root1的集合较大
{
a[root1-].parent += a[root2-].parent;
while (!a[root2-].children.empty())
{
a[root1-].children.push_back(a[root2-].children.back());
a[ a[root2-].children.back()- ].parent = root1-;
a[root2-].children.pop_back();
}
}
else
{
a[root2-].parent += a[root1-].parent;
while (!a[root1-].children.empty())
{
a[root2-].children.push_back(a[root1-].children.back());
a[ a[root1-].children.back()- ].parent = root2-;
a[root1-].children.pop_back();
}
}
} int main()
{
int N=;
scanf("%d",&N);
a = new PC[N];
for (int i=;i<N;i++)
{
a[i].data = i+;
a[i].parent = -;
a[i].children.push_back(i+);
} char operation='a',temp;
int c1=,c2=; scanf(" %c",&operation);
while (operation != 'S')
{
scanf("%d %d",&c1,&c2);
if (operation == 'C')
{
if ( find(c1) == find(c2) )
printf("yes\n");
else
printf("no\n");
}
if (operation == 'I')
{
unite(c1,c2);
}
scanf(" %c",&operation);
}
int component=;
for (int i=;i<N;i++)
{
if (a[i].parent < )
++component;
}
if (component == )
{
cout << "The network is connected." << endl;
}
else
{
cout << "There are " << component << " components." << endl;
}
return ;
}
												

PAT 5-8 File Transfer (25分)的更多相关文章

  1. 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 ...

  2. 05-树8 File Transfer (25 分)

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

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

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

  4. PAT 1009 Product of Polynomials (25分) 指数做数组下标,系数做值

    题目 This time, you are supposed to find A×B where A and B are two polynomials. Input Specification: E ...

  5. PAT A1122 Hamiltonian Cycle (25 分)——图遍历

    The "Hamilton cycle problem" is to find a simple cycle that contains every vertex in a gra ...

  6. PAT A1142 Maximal Clique (25 分)——图

    A clique is a subset of vertices of an undirected graph such that every two distinct vertices in the ...

  7. [PAT] 1142 Maximal Clique(25 分)

    1142 Maximal Clique(25 分) A clique is a subset of vertices of an undirected graph such that every tw ...

  8. PAT 甲级 1020 Tree Traversals (25分)(后序中序链表建树,求层序)***重点复习

    1020 Tree Traversals (25分)   Suppose that all the keys in a binary tree are distinct positive intege ...

  9. PAT 甲级 1146 Topological Order (25 分)(拓扑较简单,保存入度数和出度的节点即可)

    1146 Topological Order (25 分)   This is a problem given in the Graduate Entrance Exam in 2018: Which ...

随机推荐

  1. response 下载文件

    String basePath = "D://test.json"; String filename = basePath.substring(basePath.lastIndex ...

  2. csshover.htc CSS兼容

    以下为csshover.htc 内容 <attach event="ondocumentready" handler="parseStylesheets" ...

  3. 关于ViewPager、ViewFilpper、ViewFlow三种实现水平向滑动方式的比较

    ViewPagerViewPager类提供了多界面切换的新效果.新效果有如下特征:[1] 当前显示一组界面中的其中一个界面.[2] 当用户通过左右滑动界面时,当前的屏幕显示当前界面和下一个界面的一部分 ...

  4. gulp教程之gulp-htmlmin

    简介: 使用gulp-htmlmin压缩html,可以压缩页面javascript.css,去除页面空格.注释,删除多余属性等操作. 1.安装nodejs/全局安装gulp/本地安装gulp/创建pa ...

  5. 多行溢出隐藏显示省略号功能的JS实现

    在页面重构中,经常需要将过多的内容隐藏而显示部分.在单行文本中实现非常简单,但是在多行文本中,则需要根据实际选择不同的方式. 用CSS实现多行溢出隐藏的代码非常简单,但是兼容性也相对较低. displ ...

  6. TEA,XXTEA介绍,对称加密

    总结:在使用加密的时候,我们可以加入随机数,这样相同的明文,每次加密后得到不同的密文,同时可以在密文中加入密文有效期,控制密文的有效时间长度. 针对有的功能扩展使用,很好的思想. TEA对 64 位数 ...

  7. CSS实现各种形状

    CSS3的一个非常酷的特性是允许我们创建各种规则和不规则形状的图形,从而可以减少图片的使用.以前只能在Photoshop等图像编辑软件中制作的复杂图形现在使用CSS3就可以完成了.通过使用新的CSS属 ...

  8. STC12C5A60S2 @ 22.0184Mhz 精确延时

    #include "STC12.h" // STC12C5A60S2 @ 22.0184Mhz 精确延时 void delay_10us(unsigned char n) { un ...

  9. Apache与nginx优缺点对比

    1.nginx相对于Apache优点: nginx轻量级,同样起web服务,比apache占用更少的内存资源: 抗并发,nginx处理请求是异步非阻塞型的,Apache处理请求是阻塞型的,所以在处理高 ...

  10. js对特殊字符转义、时间格式化、获取URL参数

    /*特殊字符转义*/ function replace_html(str) { var str = str.toString().replace(/&/g, "&" ...