タイトル
N(1≤N≤100)牛、便利な1番... Nは、プログラミングのコンテストに参加しています。私たちは皆、より良い他のものより、いくつかの牛がコードを知っているよう。それぞれの牛は、競合他社の中で一意であるある一定のスキルの評価を持っています。
コンテストは2頭の間で、それぞれ、いくつかの頭に頭のラウンドで行われます。牛Aは、牛Bより大きいスキルレベルがある場合(1≤A≤Nを1≤B≤N、A≠B)、次いで牛Aは常に牛Bを打つであろう
ファーマージョンはスキルレベルによって牛をランク付けしようとしています。リスト所与Mの結果(1≤M≤4,500)二牛のラウンドは、ランク正確結果から決定することができる牛の数を決定します。ラウンドの結果が矛盾しなくなることが保証されます。
入力
- 1行目:二スペースで区切られた整数:NとM
- ライン2 ... M + 1:AおよびB:各行は競争の単一ラウンドの競合及び結果を記載する2スペースで区切られた整数(、Aは、勝者最初の整数である)を含みます
出力
- 行1:ランクを決定することができる牛の数を表す単一の整数
サンプル入力
5
4 3
4 2
3 2
1 2
2 5
サンプル出力
2
点をポイントとして牛、iはウシ牛を打つことができるjは、j個のパス1〜Iからの長さがある場合には単方向であり、iがjに-1の一方向パスの長さを有し、その結果通信に問題かどうか。他のすべての牛への牛の接続した場合、牛のレベルは、あなたが決めることができるということです。牛の100頭は、あなたはフロイド使用することができます。フロイド1又は共に-1場合に比較サイズ実行しないが、二つの経路により選択されていない、私は牛> K牛> JまたはIウシ牛<Kウシ<J牛を表します。
コード:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#define INF 0x3f3f3f3f
using namespace std;
int n,m,a[1000][1000];
int main()
{
int A,B;
cin>>n>>m;
memset(a,INF,sizeof(a));
for (int i=1;i<=m;i++)
{
cin>>A>>B;
a[A][B]=1;
a[B][A]=-1;
}
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][k]!=INF)
a[i][j]=a[i][k];
int ans=0,sum=0;
for (int i=1;i<=n;i++)
{
sum=0;
for (int j=1;j<=n;j++)
{
if (a[i][j]!=INF)
sum++;
}
if (sum==n-1)
ans++;
}
cout<<ans;
return 0;
}