Description
Bob是一个网络管理员,负责监控计算机网络。他要维护网络内计算机之间的连接的日志。每个连接是双向的。如果两台计算机是直接连接的,或者与同一台计算机互联,则我们称这两台计算机是互联的。有的时候,需要Bob根据日志信息作出判断,确定给出的两台计算机是否直接或间接地互联。
请基于输入信息编写一个程序,回答下述问题的“是”和“否”的次数: computeri 是否与computerj 互联?
Input
输入包含多个测试样例。每个测试用例定义如下:
1 网络中计算机的个数(一个正整数);
2 一个列表,每句的形式如下:
(a) c computeri computerj,其中computeri 和computerj 是整数,表示计算机的编号,编号取值从1到网络中计算机的个数。
这句表示computeri 和computerj是互联的。
(b) q computeri computerj,其中computeri 和computerj是整数,表示计算机的编号,编号取值从1到网络中计算机的个数。这句表示这样的问题:computeri 和computerj是互联的吗?
测试用例之间用空行分开。
列表中每句一行。句中计算机出现的次序是任意的,与语句类型无关。在语句类型 (a) 被处理以后,修改日志;对于语句类型(b),则根据当前网络设置进行处理。
输入包含多组测试样例,遇到0结束。
Output
对于所有(b)语句,有N1个回答“是”和N2个回答“否”。程序在一行中按这样的次序输出两个数字:N1, N2,如样例输出所示。在两个测试用例之间有一个空行。
Sample Input
10
c 1 5
c 2 7
q 7 1
c 3 9
q 9 6
c 2 5
q 7 5
0
Sample Output
1, 2
#include<bits/stdc++.h>
using namespace std;
int n;
char c;
int fa[114514];
void init(int n){
for(int i=1;i<=n;i++){
fa[i]=i;
}
}
int find(int x){
if(fa[x]==x) return x;
else return fa[x]=find(fa[x]);
}
void merge(int x,int y){
x=find(x);
y=find(y);
if(x==y) return;
fa[x]=y;
}
int ans,anss,ansf;
int main(){
cin>>n;
init(n);
int a,b;
for(int i=1;i<=n;i++){
cin>>c;
if(c=='0') break;
cin>>a>>b;
if(c=='c'){
merge(a,b);
}else if(c=='q'){
if(find(a)==find(b)){
anss++;
}else{
ansf++;
}
}
}
cout<<anss<<","<<ansf<<endl;
return 0;
}
不知道哪里有问题