网络连接

                                        网络连接

Description

Bob是一个网络管理员,负责监控计算机网络。他要维护网络内计算机之间的连接的日志。每个连接是双向的。如果两台计算机是直接连接的,或者与同一台计算机互联,则我们称这两台计算机是互联的。有的时候,需要Bob根据日志信息作出判断,确定给出的两台计算机是否直接或间接地互联。

请基于输入信息编写一个程序,回答下述问题的“是”和“否”的次数:

computer_{i}是否与computer_{j}互联? 

Input

输入包含多个测试样例。每个测试用例定义如下:

1 网络中计算机的个数(一个正整数);

2 一个列表,每句的形式如下:

(a) c computer_{i} computer_{j},其中computer_{i}computer_{j}是整数,表示计算机的编号,编号取值从1到网络中计算机的个数。这句表示computer_{i} 和computer_{j}是互联的。

(b) q computer_{i} computer_{j},其中computer_{i}computer_{j}是整数,表示计算机的编号,编号取值从1到网络中计算机的个数。这句表示这样的问题:computer_{i} 和computer_{j}是互联的吗?

测试用例之间用空行分开。

列表中每句一行。句中计算机出现的次序是任意的,与语句类型无关。在语句类型 (a) 被处理以后,修改日志;对于语句类型(b),则根据当前网络设置进行处理。

Output

对于所有(b)语句,有N_{1}个回答“是”和N_{2}个回答“否”。程序在一行中按这样的次序输出两个数字:N_{1},N_{2},如样例输出所示。在两个测试用例之间有一个空行。

Sample Input

10
c 1 5
c 2 7
q 7 1
c 3 9
q 9 6
c 2 5
q 7 5

Sample Output

1,2

 

 Solution

并查集裸题,维护两台计算机间关系,但是……

输入是什么鬼?

(未完待续)

Code

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define N 20010
int m,k,x,y,a,b;
long long n;
char op;
char s[N];
struct union_Find_Sets{
	int fa[N];
	int findFa(int v){return fa[v]==v?v:fa[v]=findFa(fa[v]);}
	void unionn(int v,int u){fa[v]=u;}
	void init(int size){for(int i=1;i<=n;i++)fa[i]=i;}
}ufs;
int main(){
	cin>>n;
	here:;
	ufs.init(n);
	while(1){
		if(scanf("%s",s)==-1)break;
		//if(s[0]==-1)break;
		if(s[0]>='1'&&s[0]<='9'){
			//system("pause");
			cout<<a<<", "<<b<<endl;
			a=b=n=0;
			for(int i=0;i<strlen(s);i++)n=n*10+(s[i]-'0');
			goto here;
		}
		else if(s[0]=='q')op='q';
		else if(s[0]=='c')op='c';
		else break;
		cin>>x>>y;
		int fx=ufs.findFa(x),fy=ufs.findFa(y);
		if(op=='c'){
			if(fx!=fy)ufs.unionn(fx,fy);
		}
		else{
			if(fx==fy)a++;
			else b++;
		}
	}
	cout<<a<<", "<<b<<endl;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值