NのFJ(1 <= N <= 100)牛が最近コンテスト:)をプログラミング分野に参加しています。ゲームでは、牛は1..Nに応じて番号が付けられています。各牛のプログラミングのスキルが同じではないん、と言うことですレベルパー、どの2頭の牛、機能をプログラミング牛は明確な順位を持っています。全体のゲームはいくつかのラウンドに分けられ、各ラウンドの対決2は、乳牛の数を指定しました。もしA牛Bの数の能力をプログラムの牛の数、(1 <= A <= N、1 <= B <= N ;! A = B)、次いで、それらのデュエルは、番号牛A、常に勝ちます。彼は牛を雇ったので、FJは、能力をプログラミングする特定のランキング牛を知りたいのですがM(1 <= M <= 4500)のラウンドのすべての結果だった、私はあなたがプログラミングの牛に合わせて可能な限り推測することができ、この情報を願っていますランクへの能力。競争の結果は矛盾しないことが保証されます。
概略未満フロイドコード、すべての後、フロイド又は缶の慣行に従って<= 100 N ^ 3 Nを参照。
まず第一には、牛の順位を決定するためにどのように、この質問を考え、どうやら彼は持つすべての牛の他の関係を勝ち負けを決定します。唯一の勝利または両方のケースを失っているので、あまりにも長い間、我々は状況を勝利として記録することができます。aとb、S [A] [B] = 1を入力勝利bを示しています。この前処理の後、彼はフロイドを実行し始めました。次のようにフロイドコードである(後述)。
1 空隙フロイド() 2 { 3 のための(INT T = 1、T ++; T <= N ) 4 { 5 のための(INT iは= 1 ; <I = N I ++ ) 6 { 7 ための(int型、J = 1、J <= N; J ++ ) 8 { 9 もし(S [i]は[T] && S [T] [J]) 10 S [I] [J] = 1 。 11 } 12 } 13 } 14 }
tは私が勝った勝利とt jの場合tは、中継ノードとみなすことができる場所、その後、私は単純な論理である私jは、推測することができる勝ちます。その後、我々は答えをカウントし始めることができます。私は勝つjで表すが、S [I場合= 1 [I] [J] = 1 [j]をね、私はJを獲得表し[i]のよ、あなたは2頭の間の関係を決定するかどうかを知っていますか、問題を考えてみましょう] [J] = 0 && S [J] [I] = 0は明らかに真実ではないである、私は、jに私は失われたJを失ったことを意味するものではありませんが、何の決定はありません。以来かを決定するために、前にも言った牛のランクの受賞や彼の関係を失い、すべての牛はOK、限りがあるので、我々はすぐ隣の牛に進んで不確実な判決に始まっていることに基づきます。コードのこの部分:
1 のための(INT iは= 1 ; iが<= N; I ++ ) 2 { 3 int型 F = 1 。 4 のための(INT J = 1 ; J <= N; J ++ ) 5 { 6 場合(I == j)を続けます。 7 場合(S [I] [J] == 0 && S [j]は[I] == 0 ) 8 { 9 F = 0 。 10 休憩; 11 } 12 } 13 であれば(== F 1 ) 14 歳++ 。 15 }
全体のコード:
1の#include <cstdioを> 2の#include <アルゴリズム> 3の#include <cmath> 4の#include <iostreamの> 5の#include <CStringの> 6 使用して 名前空間をSTD。 7 整数N、M、B。 8 INT S [ 1000年 ] [ 1000年]。 9 int型リード() 10 { 11 INT X = 1、= 0 ; 12 チャー CH = GETCHAR()。 13 一方(CH < ' 0 ' || CH>' 9 ' ) 14 { 15 であれば(CH == ' - ')X = - 1 。 16 CH = GETCHAR()。 17 } 18 ながら、(CH <= ' 9 ' && CH> = ' 0 ' ) 19 { 20 、A = A * 10 + CH - ' 0 ' 。 21 CH = GETCHAR()。 22 } 23 リターン X * 。 24 } 25 ボイドフロイド() 26 { 27 のために(INT T = 1 ; T <= N; T ++ ) 28 { 29 のためには、(INTは iは= 1 ; I <= N; I ++ ) 30 { 31 のために(INT J = 1。 J <= N; J ++ ) 32 { 33 であれば(S [i]は[T] && S [T] [J]) 34 S [I] [J] = 1 。 35 } 36 } 37 } 38 } 39 のint main()の 40 { 41 INT ANS = 0 。 42 N = )(読み取ります。 43 、M = ()を読み出します。 44 のために(INT iは= 1 ; iが<= M; I ++ ) 45 { 46 =を読み取ります()。 47 B = (読み取り) 48 S [A] [B] = 1 。 49 } 50 フロイド()。 51 のために(INT I =1 ; I <= N; I ++ ) 52 { 53 のint = F 1 。 54 のために(INT J = 1 ; J <= N; J ++ ) 55 { 56 であれば(I == j)を続けます。 57 であれば(S [I] [J] == 0 && S [j]は[I] == 0 ) 58 { 59 F = 0 。 60 ブレーク; 61 } 62 } 63 であれば(== F 1) 64 歳++ ; 65 } 66 coutの<< 年。 67 リターン 0 ; 68 }