7-1 File Transfer
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
≤
1
0
4
2≤N≤10^4
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
1
1 and
N
N
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.
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.
My code
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef int ElementType;
typedef int SetType;
void Initialization(int *s, int n);
void SetUnion(int *s, int root1, int root2);
SetType Find(int x, int *s);
int main()
{
int n;
scanf("%d", &n);
int *s = (int*)malloc(sizeof(int) * (n + 1));
Initialization(s, n + 1);
char tmp[2];
scanf("%s", tmp);// one string, two numbers
int c1, c2;
while (strcmp(tmp, "S") != 0) {
scanf("%d%d", &c1, &c2);
if (strcmp(tmp, "C") == 0) {// checking if it is possible to transfer files between c1 and c2
if (Find(c1, s) == Find(c2, s)) {
puts("yes");
}
else {
puts("no");
}
}
else if (strcmp(tmp, "I") == 0) {// inputting a connection between c1 and c2
SetUnion(s, Find(c1, s), Find(c2, s));
}
scanf("%s", &tmp);
}
int cnt = 0;
for (int i = 1; i <= n; i++) {
if (s[i] < 0) {
cnt++;
}
}
if (cnt == 1) {
puts("The network is connected.");
}
else if (cnt > 1) {
printf("There are %d components.", cnt);
}
return 0;
}
void Initialization(int *s, int n)
{
memset(s, -1, sizeof(s[0]) * n);// initialize this piece of content to -1
}
/* Code ofr disjoint set Find with path compression*/
SetType Find(int x, int *s)
{
if (s[x] <= 0) {
return x;
}
return s[x] = Find(s[x], s);
}
void SetUnion(int *s, int root1, int root2)
{
if (root1 == root2) {
return ;
}
if (s[root2] < s[root1]) {
s[root2] = s[root2] + s[root1];
s[root1] = root2;// 如果root2的size大小更大,那么将root1指向root2
}
else {
s[root1] = s[root1] + s[root2];
s[root2] = root1;
}
}