タイトルの説明
乳業は活況を呈しています!ファーマージョンの乳処理プラントには、1 ... N(1≤N≤100)の番号が付けられたN個の処理ステーションと、N-1チャネルがあり、それぞれが2つの処理ステーションに接続されています。(チャネル構造は高価であるため、ファーマージョンは、すべての処理ステーションが他のすべての処理ステーションに到達できるように、チャネルの最小数を使用することを選択しました)。
革新と効率向上のために、ファーマージョンは各チャネルにコンベヤーベルトを取り付けました。残念ながら、コンベヤーベルトが一方向であることに気づいたとき、それは遅すぎ、今では各チャネルは一方向にしか通過できません!したがって、今では、すべての処理ステーションが他の処理ステーションに到達できる状況ではなくなりました。
ただし、ファーマージョンは、他のすべての処理ステーションから到達できる少なくとも1つの処理ステーションiがある限り、事態は完全な失敗ではない可能性があると考えています。他の処理ステーションjから処理ステーションiへは、iとjの間のいくつかの中間ステーションを通過できることに注意してください。ファーマージョンがそのような処理ステーションiが存在するかどうかを確認するのを手伝ってください。
入力
入力の最初の行には、処理ステーションの数である整数Nが含まれています。次のN-1行にはそれぞれ、スペースで区切られた2つの整数aiとbiが含まれ、1≤ai、bi≤N、ai i biを満たします。これは、処理ステーションaiから処理ステーションbiに移動するコンベヤベルトがあり、aiからbiの方向にのみ移動できることを意味します。
アウトプット
満足する処理ステーションiがあれば、他のどの処理ステーションからも到達でき、条件を満たす最小のiが出力される。それ以外の場合は、-1を出力します。
入力例
3
1 2
3 2
出力例
2
分析
この質問も非常に単純です。アイデアは、N個のポイント、N-1個の単方向エッジがあり、どのポイントがすべてのポイントにアクセスできるかということです。
マルチソースが最も短いので、フロイドが使用されていることがわかります。Connectedは1で、disconnectedは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;
}