洛谷 P1700 [USACO19OPEN] Milk Factory B

#include<iostream>
#include<cstring>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<cmath>
#include<iomanip>
#include<queue>
#include<bitset>
#include<cstdlib>
#include<cstdio>
#include<sstream>
#include<stack>
using namespace std;
const int maxn = 105;
int n;
vector<int> v[maxn];
bool vis[105] = { 0 };
bool bfs(int d) {
	queue<int> q;
	q.push(d);
	int k = 1;
	vis[d] = 1;
	while (!q.empty()) {
		int a = q.front();
		q.pop();
		for (auto x : v[a]) {
			if (!vis[x]) {
				q.push(x);
				k++;
			}
		}
	}
	return k == n;
}
void work() {
	cin >> n;
	for (int i = 2; i <= n; i++) {
		int ix, iy;
		cin >> ix >> iy;
		v[iy].push_back(ix);
	}
	bool sign = false;
	for (int i = 1; i <= n; i++) {
		memset(vis, false, sizeof vis);
		if (bfs(i)) {
			cout << i;
			sign = true;
			break;
		}
	}
	if (!sign)cout << -1;
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	int testcase = 1;
	while (testcase--) {
		work();
	}
	return 0;
}

我们利用vector容器记录一个点可以作为哪些点的“头”,然后就从最小的点开始暴力bfs,在bfs之前,初始化一下vis数组用以记录每个点有没有被放入过。在bfs过程中,我们每次取队列的第一个元素(队列不为空),然后将以第一个元素为“头”的且没有放入过队列的元素入队,记录最后入队次数是否等于n,如果等于,直接输出即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值