时间限制:2 秒 / 内存限制:1024 MiB

得分: 300 分

《A - 回文数》《A - 回文数》《A - 回文数》

问题描述

高桥正在玩一个游戏。这个游戏有编号为 1 到 N 的 N 个技能。

给你 N 对整数 (A1​,B1​),…,(AN​,BN​) 。
如果 (Ai​,Bi​)=(0,0) ,那么高桥已经学会了技能 i 。
否则,高桥能够学会技能 i 的条件是,技能 Ai​ 和 Bi​ 中至少有一个已经被学会。

包括已经掌握的技能,找出高桥最终可以学习的技能数量。

《A - 回文数》《A - 回文数》《A - 回文数》

约束条件

  • 1≤N≤2×105
  • (Ai​,Bi​)=(0,0) 或 1≤Ai​,Bi​≤N
  • 所有输入值都是整数。

《A - 回文数》《A - 回文数》《A - 回文数》

输入

输入从标准输入中按以下格式给出:

N
A1​ B1​
A2​ B2​
⋮
ANBN
《A - 回文数》《A - 回文数》《A - 回文数》

输出

输出答案。


《A - 回文数》《A - 回文数》《A - 回文数》

示例输入 1 复制

复制
6
0 0
1 3
3 2
5 5
4 6
6 4
《A - 回文数》《A - 回文数》《A - 回文数》

示例输出 1 复制

复制
3

最初,高桥已经学习了技能 1 。因为技能 1 已经被学习,所以可以学习技能 2 ,学习技能 2 可以学习技能 3 。由于不可能学习技能 4,5,6 ,所以答案是 3 。


《A - 回文数》《A - 回文数》《A - 回文数》

样本输入 2 复制

复制
4
0 0
0 0
0 0
0 0
《A - 回文数》《A - 回文数》《A - 回文数》

样本输出 2 复制

复制
4

思路

考虑bfs,首先加入学会的知识,然后,若根据这个知识能学会某知识且该知识未学,则加入队列,并标记。

代码见下

#include<bits/stdc++.h>
using namespace std;
long long n,a[200005],b[200005],f[200005],lk=0;
vector<long long> v[200005];
queue<long long> q;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i]>>b[i];
		if(a[i]==0&&b[i]==0){
			f[i]=2;
			q.push(i);
		}
		else{
			v[a[i]].push_back(i);
			v[b[i]].push_back(i);
		}
	}
	while(q.size()>=1){
		long long qa=q.front();
		q.pop();
		for(int i=0;i<v[qa].size();i++){
			long long tt=v[qa][i];
			f[tt]++;
			if(f[tt]==1){
				q.push(tt);
			}
		}
	}
	lk=0;
	for(int i=1;i<=n;i++){
		if(f[i]>=1){
			lk++;
		}
	}
	cout<<lk<<endl;
	return 0;
}

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐