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≤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." 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.
并查集的题目
输入中:
第一个数字表示有多少个节点
C表示检查两个节点是否相连
I 表示链接两个节点
S表示输入结束
输出:
如果要求检查,那么就根据是否相连输出yes或no
最后结束输出时检查整个网络是否全部相连
#include <iostream>
#define Tree int
typedef struct _node
{
int data;
Tree parent;
}node;
void option(node[], char opt);
void connect(node[], Tree, Tree);
void check(node[], Tree, Tree);
int main()
{
int N;
std::cin >> N;
node *network = new node[N+1];
for (int i = 1; i <= N; i++)
{
network[i].data = i;
network[i].parent = -1;
}
char opt;
do
{
std::cin >> opt;
option(network, opt);
} while (opt != 'S');
int root_num = 0;
for (int i = 1; i <= N; i++)
{
if (network[i].parent < 0)
root_num++;
}
if (root_num > 1) std::cout << "There are " << root_num << " components." << std::endl;
else if (root_num == 1) std::cout << "The network is connected." << std::endl;
else std::cout << "error!" << std::endl;
return 0;
}
void option(node network[], char opt)
{
if (opt == 'S') return;
Tree com_1, com_2;
std::cin >> com_1 >> com_2;
if (opt == 'C')
check(network, com_1, com_2);
else if (opt == 'I')
connect(network, com_1, com_2);
}
void check(node network[], Tree com_1, Tree com_2)
{
Tree root_1 = com_1, root_2 = com_2;
while (network[root_1].parent >= 0) //找到父节点
root_1 = network[root_1].parent;
while (network[root_2].parent >= 0) //找到父节点
root_2 = network[root_2].parent;
if (root_1 == root_2)
std::cout << "yes" << std::endl;
else
std::cout << "no" << std::endl;
}
void connect(node network[], Tree com_1, Tree com_2)
{
Tree root_1 = com_1, root_2 = com_2;
while (network[root_1].parent >= 0)
root_1 = network[root_1].parent;
while (network[root_2].parent >= 0)
root_2 = network[root_2].parent;
if (network[root_1].parent < network[root_2].parent) {
network[root_2].parent = root_1;
network[root_1].parent--;
}
else {
network[root_1].parent = root_2;
network[root_2].parent--;
}
}