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.
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.
#include<stdio.h>
#include<stdlib.h>
int FindRoot(int* Computer, int Machine);
void GetConnected(int* Computer,int N);
void MergeSet(int* Computer, int RootA, int RootB);
int main()
{
int N;//电脑数量
scanf("%d", &N);
int* Computer = (int*)malloc(sizeof(int) * (N+1));
for (int i = 1; i <=N; i++)
{
Computer[i] = -1;
}
GetConnected(Computer,N);
}
void GetConnected(int* Computer,int N)
{
char Operator;
int ComputerA;
int ComputerB;
int RootA;
int RootB;
int Count = 0;
int* Root;
int* FinalRoot;
int Flag = 0;
Root = (int*)malloc(sizeof(int) * (N+1));
FinalRoot= (int*)malloc(sizeof(int) * (N+1));
scanf(" %c", &Operator);
while (Operator != 'S')
{
scanf("%d", &ComputerA);
scanf("%d", &ComputerB);
if (Operator == 'I')
{
RootA = FindRoot(Computer, ComputerA);
RootB = FindRoot(Computer, ComputerB);
MergeSet(Computer, RootA, RootB);
}
else
{
RootA = FindRoot(Computer, ComputerA);
RootB = FindRoot(Computer, ComputerB);
if (RootA == RootB)
{
printf("yes\n");
}
else
printf("no\n");
}
scanf(" %c", &Operator);
}
for (int i = 1; i <=N; i++)
{
Root[i] = FindRoot(Computer, i);
}
for (int i = 1; i <= N; i++)
{
if (Count == 0)
{
FinalRoot[++Count] = Root[i];
}
else
{
for (int j = 1; j <= Count; j++)
{
if (FinalRoot[j] == Root[i])
{
Flag = 1;
}
}
if (Flag == 0)//确实无
{
FinalRoot[++Count] = Root[i];
}
Flag = 0;
}
}
if (Count > 1)
printf("There are %d components.", Count);
else
printf("The network is connected.");
}
int FindRoot(int* Computer, int Machine)
{
int Root = Machine;
for (; Computer[Root] > 0; Root = Computer[Root])
{
}
return Root;
}
void MergeSet(int* Computer, int RootA, int RootB)
{
if (Computer[RootA] < Computer[RootB])
{
Computer[RootA] += Computer[RootB];
Computer[RootB] = RootA;
}
else
{
Computer[RootB] += Computer[RootA];
Computer[RootA] = RootB;
}
}
并查集
今天爬山去天文台看了月亮的陨石坑,有点模糊.