トピックの背景
[Usaco2008月]
タイトル説明
Nは牛、便利番1..N(100≤1≤N)、プログラミングのコンテストに参加しています。我々はすべて知っているように、いくつかの牛は他より良いコード。それぞれの牛は、競合他社の中で一意であるある一定のスキルの評価を持っています。
コンテストは2頭の間で、それぞれ、いくつかの頭に頭のラウンドで行われます。牛Aは、牛B(1≤B≤N; 1≤A≤N≠B)より大きいスキルレベルを有する場合、牛Aは常に牛B.を打つであろう
ファーマージョンはスキルレベルによって牛をランク付けしようとしています。(4,500≤1≤M)Mの結果、二牛ラウンドリストが与えられると、そのランク結果から正確に決定することができる牛の数を決定します。ラウンドの結果が矛盾しなくなることが保証されます。
NのFJ(1 <= N <= 100)牛は最近、フィールドプログラミングコンテスト:)に参加しています。ゲームでは、牛は1..Nに応じて番号が付けられています。機能をプログラミング牛は明確な順位を持って、それぞれの牛のプログラミングのスキルは同じではありません、そしてどのレベルパーどの2頭の牛が、それは言うことはありません。全体のゲームは、乳牛の数を指定した各ラウンドの対決2、数回に分けています。牛B、数のプログラミング能力の牛Aの数と(1 <= A <= N、1 <= B <= N ;! A = B)は、次いで、それらのデュエルは、番号牛A、常に勝ちます。M(1 <= M <= 4500)のラウンドのすべての結果だった、私はこの情報があなたがプログラミングの牛に合わせて可能な限り推測することを願ってFJが能力をプログラミングする特定のランキング牛を知っていただきたいと思いますので、彼は牛を雇っランク付けする機能。競争の結果は矛盾しないことが保証されます。
入力形式
1行目:2スペースで区切られた整数で:NとM
+ 1行第2..M:各行2スペースで区切られた整数A、Bは、多数のラウンドに参加する牛を記述し、その結果(符号A、各行の最初のものです牛の数)が勝者であります
出力フォーマット
ランキング牛を表す整数を決定することができる出力の数:ライン1
サンプル入力と出力
5 4 3 4 2 3 2 1 2 2 5
2
説明/ヒント
出力説明:
牛の数は、第2、3、4頭の牛を失ったことこれら3つの牛乳よりも彼女のレベル
牛が悪いです。乳牛の数5と彼女の手の中に失われたが、それは、言うことを第5号よりも彼女のレベルであります
牛強いです。このように、牛のランク数は必ずしも4 2、5番横牛がなければなりません
しかし、最悪。ランク他の3頭の牛はまだ不明です。
解決策:その上に水をフロイド使用!Bは、ビートが私をK場合、[A] [B] = 1、k個の敗北jは、iがjで倒すことができるビートFが配置されています
最後に、かどうかを各点との関係の結果の他の点を決定します。1でない場合は、ランキングを決定することはできません。
書式#include <iostreamの> の#include <アルゴリズム> 書式#include <キュー> の#include <cmath> の#include <CStringの> の#include <cstdlib> 書式#include <cstdioを> 使用して 名前空間はstd; const int型 N = 1005 ; INTのN、M、F [N] [N]、X、Y、ANS。 INT メイン(){ freopenは(" 2419.in "、" R " 、STDIN)。 freopenは(" 2419.out "、" W " 、STDOUT)。" %d個%のD "、&N、&M)。 以下のために(int型私= 1 ; I <= M; iが++ ){ scanf関数(" %D%D "、およびX&Y)。 F [X] [Y]は = 1 。 } のために(int型のk = 1 ; kは<= N; ++ k個) のために(int型 i = 1 ; iが<= N; I ++ ) のための(INT J = 1 ; J <= N; J ++ ) であれば(F [i]が[ K] == 1 && F [k]は[J] ==1)[i] [j]は= F 1 。 以下のために(int型 i = 1 ; iが<= N; iは++ ){ int型フラグ= 1 。 用(INT J = 1 ; J <= nであり、j ++ ){ 場合(I == j)は続けます。 もし(F [I] [J] == 0 && F [j]は[I] == 0 ) {フラグ = 0。破ります; } } ANS + = フラグ。 } のprintf(" %dの"、年); リターン 0 ; }