PTAタイトルセットのデータ構造とアルゴリズム(中国)7-8
試験へのハリーポッターは、彼はあなたの助けを必要とします。研究のこのコースは、他の動物への動物の能力の呪いです。たとえば、猫はマウスは呪いがそうで笑魚であるとなると、マウスの呪いが笑ですとなります。呪いの反対方向への変化は、たとえば、それは猫にAHAHマウスすることができ、単に上下逆さまに読んで、元の呪文です。また、あなたは猫の魚になりたい場合は、直接の呪いのラララを読むことができます、あなたも猫のマウスを変更することができ、ラットの魚はなっても、それは読んでスペル:hahahehe。
ハリー・ポッターの手は今、スペルのすべてを一覧表示し、変形した動物になることができ教科書を持っています。先生は彼が診察室に動物を持ち込むことはでき、彼はどんな動物に指定スキルになるために勉強するために動物を置きます。そこで彼は、あなたを求める:動物の種類を変更することが最も困難にするためにどのような動物をもたらすことができる(すなわち、動物はハリー・ポッターの最長の呪文が必要自分の動物を持参となります)呪いの最小値を必要としますか?たとえば:;少なくとも6と猫がで行く場合は、あなたが読む必要がネコ、ラット、魚だけならば、他の2匹の動物にマウスが唯一の4つの文字を読む必要があるので、ハリーポッターがマウスを使って行くべきであることは明らかです猫の魚になるための文字は、同様に、タコが最良の選択ではありません行きます。
入力フォーマット:
入力説明:行1は、2つの正の整数を示しN(≤)とM、Nは、試験に関与した動物の総数であり、Mが直接変形個数スペルされます。簡単にするために、我々は動物1〜によって意志N数が。続いて、M行は、各行は3つの正の整数を示し、それぞれ、2匹の動物の数、およびそれらの間に必要な変形長が(スペル≤)、数字の間のスペースで区切られました。
出力フォーマット:
出力ハリー・ポッターは、スペースで区切られた検査室の動物の長さの数だけでなく、変形の最も長い呪文を、持参してください。唯一のバンドが不可能動物すべての修正が必要な場合は、0が出力されます。あなたは動物の数を代替することができますしている場合、鳥は出力の最小数です。
サンプル入力:
6 11
3 4 70
1 2 1
5 4 50
2 6 50
5 6 60
1 3 70
4 6 60
3 6 80
5 1 100
2 4 60
5 2 80
出力例:
4 70
题目分析:一道考察图的最小路径问题 这道题是利用多源最短路径的计算方法Floyd算法来解决 注意Floyd算法中 初始化时对角线元素初始化为0 其它元素初始化为无穷大
1つ の#define _CRT_SECURE_NO_WARNINGS 2の#include <stdio.hの> 3の#include <STDLIB.H> 4の#include < malloc関数 .H> 5 の#define MaxVertexNum 100 6 の#define INIFITY 65535 7のtypedef 構造体のeNode * エッジ。 8 構造体のeNode 9 { 10 のint V1、V2。 11 int型の重量; 12 }。 13 14のtypedef 構造体 GNODE * グラフ。 15 構造体GNODE 16 { 17 INT のNv。 18 INT ネ。 19 INT G [MaxVertexNum] [MaxVertexNum]。 20 }。 21 22グラフBuildGraph(INT VertexNum) 23 { 24 グラフGraか=(グラフ)はmalloc(はsizeof(構造体GNODE))。 25 Gra->のNv = VertexNum。 26 Gra-> NE = 0 。 27 のために(int型 I = 1 ; I <= Gra-> Nvのiが++ ) 28 用(INT J = 1 ; J <= Gra->ネバダ州; J ++ ) 29 { 30 Gra-> G [I] [J] = INIFITY。 31 もし(I == j)はGra-> G [I] [J] = 0 ; 32 } 33 リターンGraか。 34 } 35 36 ボイド挿入(エッジE、グラフGraか) 37 { 38 Gra-> G [E-> V1] [E-> V2] = E-> 体重; 39 Gra-> G [E-> V2] [E-> V1] = E-> 体重; 40 } 41 42 グラフCreateGraph() 43 { 44 エッジE =(エッジ)はmalloc(はsizeof(構造体eノード))。 45 整数N、M。 46 のscanf(" %d個の%のD "、&N、&M)。 47 グラフG = BuildGraph(N)。 48 G-> NE = M。 49 のためには、(int型、I = 0 ; I <G-> NE; iは++ ) 50 { 51 のscanf(" %D%D%D "、および(E-> V1)、および(E-> V2)、および(E - > 体重)); 52 インサート(E、G)。 53 } 54 リターンG。 55 } 56 57 INTディスト[ 100 ] [ 100 ]。 58 int型のパス[ 100 ] [ 100 ]。 59 INT フロイド(グラフGraか) 60 { 61 のための(int型 I = 1 ; I <= Gra->ネバダ州; I ++ ) 62 のための(INT J = 1 ; J <= Gra->ネバダ州; J ++ ) 63 { 64 ディスト[ I] [J] = Gra-> G [I] [J]。 65 パス[I] [J] = - 1 。 66 } 67 68 のために(int型のk = 1 ; K <= Gra->ネバダ州; ++ kは) 69 のための(INT I = 1 ; I <= Gra-> NvのI ++ ) 70 のための(INT J = 1 ; jは<= Gra->ネバダ州; J ++ ) 71 であれば(ディスト[I] [K] +ディスト[K] [J] < ディスト[I] [J]) 72 { 73 ディスト[I] [J] =ディスト[I] [ K] + ディスト[K] [J]。 74 もし(I == J &&ディスト[I] [J] < 0 ) 75 リターン 0 。 76 パス[I] [J] = K。 77 } 78 リターン 1 。 79 } 80 INTマックス[ 100 ]。 81 ボイドジャッジ(グラフG) 82 { 83 のためには、(int型、I = 1 ; I <= G->ネバダ州; iは++ ) 84 { 85 マックス[I] =ディスト[I] [ 1 ]。 86 のための(int型J = 2 ; J <= G->ネバダ州。J ++ ) 87 { 88 であれば(最大[I] < ディスト[I] [J]) 89 マックス[I] = ディスト[I] [J]。 90 } 91 } 92 INT最小=最大[ 1 ]。 93 INT M = 1 。 94 のために(INT J = 2、J ++; J <= G->ネバダ州) 95 { 96 であれば(最小> マックス[J]) 97 { 98 分=マックス[J]。 99 M = J。 100 } 101 } 102 のための(int型 I = 1 ; I <= G->ネバダ州; iが++ ) 103 場合(ディスト[M] [I] == INIFITY) 104 { 105 のprintf(" 0 " )。 106 リターン; 107 } 108 のprintf(" %D%dの" 、M、最小)。 109 } 110 INT メイン() 111 { 112 グラフG = CreateGraph()。 113 であれば(フロイド(G)) 114 ジャッジ(G)。 115 そう 116 のprintf(" 0 " )。 117 リターン 0 ; 118 }