題目描述
牛奶生意正紅紅火火!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;
}