PAT 5-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<=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分)的更多相关文章
- 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 ...
- 05-树8 File Transfer (25 分)
We have a network of computers and a list of bi-directional connections. Each of these connections a ...
- pat04-树5. File Transfer (25)
04-树5. File Transfer (25) 时间限制 150 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue We have ...
- 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 ...
- PAT A1122 Hamiltonian Cycle (25 分)——图遍历
The "Hamilton cycle problem" is to find a simple cycle that contains every vertex in a gra ...
- PAT A1142 Maximal Clique (25 分)——图
A clique is a subset of vertices of an undirected graph such that every two distinct vertices in the ...
- [PAT] 1142 Maximal Clique(25 分)
1142 Maximal Clique(25 分) A clique is a subset of vertices of an undirected graph such that every tw ...
- PAT 甲级 1020 Tree Traversals (25分)(后序中序链表建树,求层序)***重点复习
1020 Tree Traversals (25分) Suppose that all the keys in a binary tree are distinct positive intege ...
- PAT 甲级 1146 Topological Order (25 分)(拓扑较简单,保存入度数和出度的节点即可)
1146 Topological Order (25 分) This is a problem given in the Graduate Entrance Exam in 2018: Which ...
随机推荐
- python爬取网易评论
学习python不久,最近爬的网页都是直接源代码中直接就有的,看到网易新闻的评论时,发现评论时以json格式加载的..... 爬的网页是习大大2015访英的评论页http://comment.news ...
- JAVA过滤器与SpringMVC拦截器之间的区别
今天学习和认识了一下,过滤器和SpringMVC的拦截器的区别,学到了不少的东西,以前一直以为拦截器就是过滤器实现的,现在想想还真是一种错误啊, 而且看的比较粗浅,没有一个全局而又细致的认识,由于已至 ...
- Github windows客户端简单使用教程
1. 首先到官网下载Github客户端,官网地址:https://desktop.github.com/ 2. 点击上图红框的按钮开始下载客户端. 3. 双击下载好的客户端,开始安装. 双击之后出现一 ...
- hexo 本地local4000打不开解决方法
错误:Cannot GET /spadesq.github.io/ (注:spadesq.github.io是原来放hexo文件夹的名字) 由于我后来把hexo文件夹搬迁到别处,但我发现打开本地,地址 ...
- hdu 5927 Auxiliary Set
传送门 分析:感觉这道题有点意思.就写一篇mark一下吧. 现场比赛的时候去枚举了儿子用了线段树+dfs序,和预想的一样T了. 可以换一个想法,从儿子对父亲的贡献来思考. 在点中先假设一个节点的每一个 ...
- 数据类型和Json格式(转载)
作者: 阮一峰 日期: 2009年5月30日 1. 前几天,我才知道有一种简化的数据交换格式,叫做yaml. 我翻了一遍它的文档,看懂的地方不多,但是有一句话令我茅塞顿开. 它说,从结构上看,所有的数 ...
- 自定义view文字垂直居中
FontMetricsInt fontMetrics = deletePaint.getFontMetricsInt(); int baseline = rect.top + (rect.height ...
- IOS Core Animation Advanced Techniques的学习笔记(五)
第六章:Specialized Layers 类别 用途 CAEmitterLayer 用于实现基于Core Animation粒子发射系统.发射器层对象控制粒子的生成和起源 CAGradient ...
- 用php获取本周,上周,本月,上月,本季度日期的代码
echo date("Ymd",strtotime("now")), "\n"; echo date("Ymd",str ...
- java 字符串转成 json 数组并且遍历
当需要把一串字符串转成一个json 数组 ,并遍历其中的内容时. 首先要导入 net.sf.json.JSONArray和net.sf.json.JSONObject 两个jar 包 String s ...