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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章