トピックへのリンク:http://acm.hdu.edu.cn/showproblem.php?pid=1599
問題の説明
杭州領域に双方向道路の間にいくつかの接続があり、N領域を有し、今8600ツアールート、点Aから経路を探して、最後に戻って指すように、想定されるV1、V2としてルート、... .VK、V1、それは> 2 Kを満たさなければならない、すなわち、少なくとも2つの他の異なる名所後起点に追加され、同じ領域にわたって繰り返すことができません。8600は現在、そのようなルートを見つける、そしてできるだけを過ごす彼を助けるためにあなたを必要とします。
入力
最初の行は、2 N及びMの整数である(N <= 100、M <= 1000)、 道路の数と景色の数を表します。
各行は三つの整数、B、C及びBの間の経路の代表を含み、それは(<= 100℃)員のCを取る次M行。
各行は三つの整数、B、C及びBの間の経路の代表を含み、それは(<= 100℃)員のCを取る次M行。
出力
各テストケースのために、私たちは、このようなルートを見つけることができれば、それは最小出力をとります。そうでない場合には、出力が「それは不可能です。」。
サンプル入力
3 3
1 2 1
2 3 1
1 3 1
3 3
1 2 1
1 2 3
2 3 1
サンプル出力
3
それは不可能だ。
タイトル効果:n個の点に、図中の最小サイクル長を求め、全くエッジを図ないようにm個のバー。
問題解決のアイデア:
1.floyd最小のリングのテンプレート
infファイルが0x3f3f3f3fであること2.注意は、3つのINFを追加すると、int型破裂するので、私たちは長い間long型の配列を開きます
コードは以下の通りであります:
1の#include <stdio.hの> 2の#include <アルゴリズム> 3 の#define LL長い長 4 の#define MEM(A、B)のmemset(A、B、はsizeof(A)) 5 使用 名前空間STDを、 6 CONST LL INF = 0x3f3f3f3f 。 7 CONST INT MAXN = 110 。 8 9 int型N、M。 10の LL DIS [MAXN] [MAXN]、[MAXN] [MAXN]マップ。// 最短路径直接路径 11 LL ANS; 12 13 空隙フロイド() 14 { 15 のANS =INF; 16 用の(int型 K = 1 ; K <= N; K ++)// 列挙中点 17。 { 18である ため(INT I = 1 ; IはK <; Iは++)// 原点 。19 ため(INT = IがJ + 1 J <K; Jを++)// 端部 20は、 ANS =分(ANS、マップ[I] [K] +マップ[K] [J] + DIS [I] [J]); / / 更新されないDISはKを注ぐ前に、kはポイントなしです。したがって、少なくとも三つの異なる点ことを保証するために 21である ため(INT I = 1。 ; <= N-I; I ++ ) 22である ため(int型 J = 1 ; J <= N。J ++ ) 23の DIS [I] [J] =分(DIS [I]、[J]、DIS [I] [K] + DIS [K] [J])。 24 } 25 であれば(!ANS = INF) 26 のprintf(" %LLDする\ n " 、ANS)。 27 他の 28 のprintf(" それは不可能です\ N。" ); 29 } 30 31 のint main()の 32 { 33 ながら(scanf関数(" %d個の%のD "、&N、&M)!= EOF) 34 { 35 のために(int型 i = 1 ; iがn = <; I ++ ) 36 のための(INT J = 1 ; J <= N; J ++ ) 37 { 38 であれば(I == j)は 39の DIS [I] [j]はマップ[I] [J] = = 0 。 40の 他 41 DIS [I] [J] =マップ[I] [J] = INF。 42 } 43 のための(int型 I = 1 ; I <= M; iが++ ) 44 { 45 int型、B; 46 LLのC; 47 のscanf(" %D%D%LLD "、&A、&B、&C)。 48の DIS [A] [B] = DIS [B] [A] =マップ[A] [B] =マップ[B] [A] =分(地図[A] [B]、C)。// 双向边 49 } 50 フロイド()。 51 } 52 リターン 0 。 53 }