排位赛二 F milk Factory

题目

牛奶行业正在蓬勃发展!农夫约翰的牛奶加工厂由N个加油站组成,方便地编号为1…N(1≤N≤100)和N-1个走道,每个人行道都连接成对的加油站。 (人行道价格昂贵,因此农夫约翰选择使用最少数量的人行道,以便最终可以从任何其他站点开始到达任何站点)。为了尝试提高效率,农夫约翰在每个人行道上安装了一条传送带。不幸的是,他意识到每个传送带只能以一种方式移动为时已晚,因此现在只能沿着一个方向行进每个人行道!现在,不再可以从任何一个站点到任何其他站点旅行。
但是,农夫约翰认为,只要至少有一个i站,这样一个人最终可以从其他每个站前往i站,一切都不会丢失。注意,从另一个任意站点j到达站点i可能涉及通过i和j之间的中间站点。请帮助农夫约翰弄清楚我是否存在这样的车站。

大致题意
在有向图里,是否有一个点,其他点都可以直接或间接的到达他

解法

edge[a][b] = 1表示可以从a到b
那么,如果edge[a][b] = 1并且edge[b][c] = 1(即a能到b, b能到c)
那么edge[a][c] = 1(显然a能到c)点比较少,直接三个for循环,枚举中间点, a能到中间点,中间点能到b, a就能到b,最后判断一下即可

代码

#include <iostream>
#include <cmath>
#include <queue>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;

bool edge[105][105]; //edge[a][b] = 1 表示可以从a 到 b 
int n, from, to;
	
void floyd() {
	for(int k=1; k<=n; ++k) {
		for(int i=1; i<=n; ++i) {
			for(int j=1; j<=n; ++j) {
				if(edge[i][k]!=0 && edge[k][j] != 0) edge[i][j] = 1;
			}
		}
	}
} 

int main() {

	cin >> n;

	for(int i=0; i<=n; ++i) edge[i][i] = 1;

	for(int i=1; i<=n-1; ++i) {
		cin >> from >> to;
		edge[from][to] = 1;
	}
	
	
	floyd();
	
	int flag;
	for(int i=1; i<=n; ++i) {
		flag = 1;
		for(int j=1; j<=n; ++j) {
			if(edge[j][i]==0){
				flag = 0;
				break;
			}
		}
		if(flag) {
			cout << i;
			break;
		}
	}
	
	if(!flag) cout << -1;
	

	


	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值