2020寒假【gmoj2408】【Milk Factory】【floyed最长路】

题目描述

牛奶生意正红红火火!Farmer John的牛奶加工厂内有N个加工站,编号为1…N(1≤N≤100),以及N−1条通道,每条连接某两个加工站。(通道建设很昂贵,所以Farmer John选择使用了最小数量的通道,使得从每个加工站出发都可以到达所有其他加工站)。
为了创新和提升效率,Farmer John在每条通道上安装了传送带。不幸的是,当他意识到传送带是单向的已经太晚了,现在每条通道只能沿着一个方向通行了!所以现在的情况不再是从每个加工站出发都能够到达其他加工站了。
然而,Farmer John认为事情可能还不算完全失败,只要至少还存在一个加工站i满足从其他每个加工站出发都可以到达加工站i。注意从其他任意一个加工站j前往加工站i可能会经过i和j之间的一些中间站点。请帮助Farmer John求出是否存在这样的加工站i。

输入

输入的第一行包含一个整数N,为加工站的数量。以下N−1行每行包含两个空格分隔的整数ai和bi,满足1≤ai,bi≤N以及ai≠bi。这表示有一条从加工站ai向加工站bi移动的传送带,仅允许沿从ai到bi的方向移动。

输出

如果存在加工站i满足可以从任意其他加工站出发都可以到达加工站i,输出最小的满足条件的i。否则,输出−1。

样例输入

3
1 2
3 2

样例输出

2

分析

这题也很简单,大意就是有N个点,N-1条单向边,问有哪个点是所有点都可以到的。
可以看出是多源最短路,所以用floyed。连通就是1,不连通就是0,所以做floyed的时候做最长路,只要值>=1,那么证明是连通的。
后面只要双重循环枚举每一对点(除了自己),如果连通就继续,当所有点都可以(>=1)的时候,就输出这个点,结束程序。如果所有点都不行,那最后输出-1。
完事~

上代码

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,a[101][101];
void floyed()
{
	for(int k=1;k<=n;k++)
	{
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=n;j++)
			{
				if(a[i][k]&&a[k][j])
				{
					a[i][j]=max(a[i][j],a[i][k]+a[k][j]);
				}
			}
		} 
	}
}
int main()
{
	freopen("factory.in","r",stdin);
	freopen("factory.out","w",stdout);
    cin>>n;
    for(int i=1;i<=n-1;i++)
    {
    	int x,y;
    	cin>>x>>y;
    	a[x][y]=1;
	}
	floyed();
	int ff;
	for(int i=1;i<=n;i++)
	{
		ff=0;
		for(int j=1;j<=n;j++)
		{
			if(i==j) continue;
			if(a[j][i]==0)//不是a[i][j],因为是从其他加油站到本身 
			{
				ff=1;
				break;
			}
		}
		if(ff==0)
		{
			cout<<i;
			return 0;
		}
	}
	cout<<-1;
	fclose(stdin);
	fclose(stdout);
    return 0;
}
发布了110 篇原创文章 · 获赞 100 · 访问量 8004

猜你喜欢

转载自blog.csdn.net/dglyr/article/details/105299887
今日推荐