http://poj.org/problem?id=3660
説明
N (1≤ N ≤100)牛、便利な1 ...の番号Nは、プログラミングのコンテストに参加しています。我々はすべて知っているように、いくつかの牛は他より良いコード。それぞれの牛は、競合他社の中で一意であるある一定のスキルの評価を持っています。
コンテストは2頭の間で、それぞれ、いくつかの頭に頭のラウンドで行われます。牛の場合 、Aは 牛よりも高いスキルレベル有し、 B (1≤ A ≤ N ; 1≤ B ≤ N ; ≠ Bを)、次いで牛 Aは 常に牛ビートます Bを。
ファーマージョンはスキルレベルによって牛をランク付けしようとしています。結果リスト所定の M (1≤ M 4,500≤)二牛のラウンドは、そのランク結果から正確に決定することができる牛の数を決定します。ラウンドの結果が矛盾しなくなることが保証されます。
入力
* 1行目:二スペース区切りの整数: N 及び M
*行2 .. M +1:各行は、競合及び結果を記載する2スペースで区切られた整数(最初の整数、含ま Aは単一のを、勝者です)競争のラウンド: A と B
出力
* 1行目:ランクを決定することができる牛の数を表す単一の整数
サンプル入力
5 5 4 3 4 2 3 2 1 2 2 5
サンプル出力
2
説明
牛2牛1、3敗、および4はこのように、牛2牛1,3のいずれかよりも良好ではない、および4牛5は、乳牛2に失うので、牛2はこのように、牛牛5よりも優れています2第四のでなければならず、牛5は、第五でなければなりません。他の牛のランクを決定することができません。
問題の意味: N牛があり、Nレベルの評価は牛のレベル間の関係の最初の部分のレベルを考えると、異なる、最もレベルでの牛の頭部を決定することができますどのように多く尋ね
1の#include <stdio.hの> 2の#include < ストリング・H> 3の#include <iostreamの> 4の#include < ストリング > 5の#include <math.h>の 6の#include <アルゴリズム> 7の#include <キュー> 8 CONST int型 INF = 0x3f3f3f3f 。 9 使用して 名前空間はstdを、 10 INT D [ 101 ] [ 101 ]。 11 12 のint main()の 13 { 14 int型N、M。 15 scanf関数(" %のDの%のD "、およびN-、&M); 16 // 入力情報 17 のために(INT I = 1 ; I <= M、Iが++ ) 18である { 19 int型A、B、 20である のscanf(" %d個の% D 」、A&、&B); 21は D [A] [B] = 1 ; // レベルより大きい又はB 22である D [B] [A] = - 1 ; // Bレベル未満である 23である } 24 25 // 適切な緩和動作(floyed推移閉包でシーク) 26がある ため(int型のk = 1 ; K <= N; ++ k個) 27 { 28 のために(int型 I = 1 ; I <= N; iが++ ) 29 { 30 のために(INT G = 1 ; G <= N、G ++ ) 31 { 32 もし(D [i]が[K] == 1 && D [k]は[G] == 1 ) 33 D [i]は[G] = 1 。 34 他の 場合(D [i]が[K] == - 1 && D [k]は[G] == - 1 ) 35 D [I] [G] = - 1。; 36 37 } 38である } 39 } 40 41である // 統計答え 42が INT ANS = 0 ; 43である ため(INT I = 1。 ;私は= N- <私は++ ) 44である { 45 INT G 、 46である ため(G = 1 ; G <= N-、G ++ ) 47 { 48 IF(!!は、I = G && D [I] [G])// 以外I = G、D [i]は [G] 0決定していない関係にG I 49 BREAKを。 50 } 51は、 IF - (N == G + 1)// ウシの牛の残りの説明は、関係決定した 52である ++ ANS ; 53れる } 54で のprintf(" %d個の\ N- " 、ANS); 55 リターン 0 ; 56です }