POJ-3660カウコンテスト(推移閉包アルゴリズムをfloyed)

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レベルの評価は牛のレベル間の関係の最初の部分のレベルを考えると、異なる、最もレベルでの牛の頭部を決定することができますどのように多く尋ね

問題解決のアイデア:
牛のレベル、それは他のN-1、及び場合牛との関係を決定するために決定された場合のみ。
そこで、任意の2点間の関係を得るために、図牛の階層関係、及び適切な緩和動作(floyed推移閉包でシーク)として見ることができ、その後、各牛のためにチェックすることができます。
 
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です }

 

おすすめ

転載: www.cnblogs.com/jiamian/p/11261751.html