羅区P2419 [USACO08JAN]牛のコンテスト牛コンテスト
https://www.luogu.org/problemnew/show/P2419
JDOJ 2554:USACO 2008月シルバー1.Cowコンテスト
https://neooj.com:8082/oldoj/problem.php?id=2554
タイトル説明
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
サンプル入力と出力
説明
出力説明:
牛の数は、第2、3、4頭の牛を失ったことこれら3つの牛乳よりも彼女のレベル
牛が悪いです。乳牛の数5と彼女の手の中に失われたが、それは、言うことを第5号よりも彼女のレベルであります
牛強いです。このように、牛のランク数は必ずしも4 2、5番横牛がなければなりません
しかし、最悪。ランク他の3頭の牛はまだ不明です。
そうとそうタイトルを打つ人が決定的にトポロジカル整列を考える打つ人を参照してください。
この質問は、歪みの問題のトポロジカルソートに属します。
コード:
書式#include <cstdioを> する#include <ベクトル> の#include <キュー> 使用して 名前空間はstdを、 INT FA [ 110 ]、RD [ 110 ]、マップ[ 110 ] [ 110 ]、パス[ 110 ] [ 110 ]、N、M。 INT見つける(INT X) { 戻り X == FA [x]はx:FA [X] =を(FA [X])を見つけます。 } int型topsort() { int型 RET = 0、QUE [ 110 << 4 ]、L = 0、R = 0 。 以下のための(int型 i = 1 ; iが= N <; ++ I)の 場合(!RD [i])と QUE [ ++ R] = I。 用(int型今; L < R;) { 今 = QUE [++ L]。 もし(L == r)は { int型 I = 1 ; 用(i = 1 ++; I <= R i)が あれば(パス[今] [QUE [I]] == 0 ) ブレーク。 もし(I == R + 1 ) RET ++ ; } のために(int型 i = 1 ; iは= N <; ++ I)の 場合(地図[今] [I]) { 場合(RD [I]) { RD [I] - 。 もし(!RD [i])と QUE [ ++ R] = I; 用(INTの J = 1 ; J <= R; ++ j)の 経路[I] [QUE [J] | = パス[今] [QUE [J]。 } } } 戻りRET。 } int型のmain() { scanf関数(" %D%dの"、&N、&M)。 用(intは X、Y、I = 1 ; I <= M + I) { scanf関数(" %D%D "、およびX&Y)。 FAは、[(y)を検索] = (X)を求めます。 RD [Y] ++ ; 地図[X] [Y] = 1 。 } int型のk = 0 。 以下のために(int型私= 1 ; iが<= N; ++I) { もし(FA [I] ==I) のk ++ ; パス[i]は[I] = 1 。 } もし(K> 1 ) のprintf(" 0 \ n " ); 他 のprintf(" %d個の\ nを" 、topsort()); リターン 0 ; }