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), 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 arek
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<iostream>
#include<fstream>
#include<vector>
#include<algorithm>
#include<string>
#include<map>
#include<functional>
using namespace std;
//ifstream inFile("C:\\Users\\DELL\\Desktop\\in.txt", ios::in);
int FindRoot(vector<int> & v,int m)
{
if(v[m]<0){
return m;
}else {
return v[m] = FindRoot(v, v[m]);
}
}
void Input_connection(vector<int> &v)
{
int root1, root2,m1,m2;
cin >> m1 >> m2;
root1 = FindRoot(v, m1);
root2 = FindRoot(v, m2);
if(root1!=root2){
v[root2] = root1;
}
}
void Check_connection(vector<int> &v)
{
int root1, root2, m1, m2;
cin >> m1 >> m2;
root1 = FindRoot(v, m1);
root2 = FindRoot(v, m2);
if (root1 != root2) {
cout << "no" << endl;
}else{
cout << "yes" << endl;
}
}
void Check_net(vector<int> & v)
{
int count = 0;
for(size_t i=1;i<v.size();++i){
if(v[i]<0){
count++;
}
}
if(count==1){
cout << "The network is connected." << endl;
}else{
printf("There are %d components.\n", count);
}
}
int main()
{
int N;
cin >> N;
vector<int> v(N+1);
fill(v.begin(), v.end(), -1);
char In;
do{
cin >> In;
if(In=='I'){
Input_connection(v);
}else if(In=='C'){
Check_connection(v);
}else if(In=='S'){
Check_net(v);
}
} while (In != 'S');
//inFile.close();
system("pause");
return 0;
}