PTAタイトルセットのデータ構造とアルゴリズム(中国)7-10
7-10村の道(30)
各村が最も低コストの接続ニーズを求めて道路を持っているように、統計表内の既存の間の村の道路は、標準の高速道路のコストの中にいくつかの道路の可能な構成を示しています。
入力フォーマット:
入力データは、町の数を含む正の整数N(≤)と候補道路の数M(≤);続いに対応するM行Mパス、各行は、それぞれ3つの正の整数で、2つの町を与える物品が直接通信経路であります数、および道路の再建の推定コスト。1から簡単にするために、町号N.
出力フォーマット:
出力村は最も低コストを必要としています。入力されたデータは、スムーズな流れを確保するのに十分でない場合は、出力が- 、より多くの道路を構築する必要性を表明しました。
サンプル入力:
6 15 1 2 5 1 3 3 1 4 7 1 5 4 1 6 2 2 3 4 2 4 6 2 5 2 2 6 6 3 4 6 3 5 1 3 6 1 4 5 10 4 6 8 5 6 3
トピック分析:クラスカル法スパースグラフの頂点を使用してプリムのアルゴリズムとの密なグラフの問題を解決するためにツリーアルゴリズムをまたがるプリムまたはクラスカル最小を使用して、グラフのツリーアルゴリズムをまたがる基本的な問題の最小値を使用すると、コーナーで発見されることはありません直後のメモをインデックス化判定ライン要素
1 の#define _CRT_SECURE_NO_WARNINGS 2の#include <stdio.hの> 3の#include <STDLIB.H> 4の#include < malloc関数 .H> 5 の#define MAXVERTEXNUM 1000年 6 の#define INIFITY 65535 7 8のtypedef 構造体のeNode * エッジ。 9 構造体のeNode 10 { 11 のint V1、V2。 12 int型の重量; 13 }。 14 15 typedefは構造体 GNODE * グラフ。 16 構造体GNODE 17 { 18 INT のNv。 19 int型ネ。 20 INT G [MAXVERTEXNUM] [MAXVERTEXNUM]。 21 }。 22 23グラフBuildGraph(INT VertexNum) 24 { 25 グラフGraか=(グラフ)はmalloc(はsizeof(構造体GNODE))。 26 Gra->のNv = VertexNum。 27 Gra-> NE = 0 。 28 のために(int型 I = 1 ; I <= Gra->ネバダ州; iが++ ) 29 のための(int型 J = 1 ; J <= Gra->ネバダ州; J ++ ) 30 { 31 であれば(I == j)は 32 Gra-> G [I] [J] = 0 ; 33 他 34 Gra-> G [I] [J] = INIFITY。 35 } 36 リターンGraか。 37 } 38 39 ボイド挿入(エッジE、グラフGraか) 40 { 41 Gra-> G [E-> V1] [E-> V2] = E-> 体重; 42 Gra-> G [E-> V2] [E-> V1] = E-> 体重; 43 } 44 45 グラフCreateGraph() 46 { 47 のint N、M。 48 のscanf(" %d個の%のD "、&N、&M)。 49 エッジE =(エッジ)はmalloc(はsizeof(構造体GNODE))。 50 グラフGraか= BuildGraph(N)。 51 Gra-> NE = M。 52 のために(int型 I = 0 ; iがMを<Iは++ ) 53 { 54 のscanf(" %D%D%D "、&(E-> V1)、および(E-> V2)、および(E-> 重量)); 55 インサート(E、Graか)。 56 } 57 リターンGraか。 58 } 59 60 INT IsEdge(グラフGraか、int型 V、INT W) 61 { 62 リターン Gra-> G [V] [W] < INIFITY。 63 } 64 65 INT ディスト[MAXVERTEXNUM]。 66 int型のパス[MAXVERTEXNUM]。 67 INT [MAXVERTEXNUM]収集されました。 68 int型の合計。 69 INTFindMin(グラフGraか) 70 { 71 INT MinDist = INIFITY。 72 INT最小= - 1 。 73 のために(int型 I = 1 ; I <= Gra-> Nvのiが++ ) 74 場合(収集[I] &&ディスト[I] <!MinDist) 75 { 76 MinDist = ディスト[I]。 77 分= I。 78 } 79 リターン分; 80 } 81 空隙プリム(グラフGraか、int型V) 82 { 83 ディスト[V] = 0 。 84 パス[V] = - 1 。 85 収集[V] = 1 。 86 のために(int型 I = 1 ; I <= Gra-> Nvのiが++ ) 87 { 88 ディスト[I] = Gra-> G [V]が[I]。 89 パス[I] = V。 90 } 91 ながら、(1 ) 92 { 93 INT分= FindMin(Graか)。 94 もし(最小== -1 ) 95 ブレーク。 96 収集[分] = 1 。 97 ディスト[分] = 0 ; 98 合計+ = Gra-> G [パス[分] [分]。 99 のためには、(int型 iは= 1 ; iが<= Gra->ネバダ州; iは++ ) 100 { 101 もし(収集[I] &&!IsEdge(Graか、最小、I)) 102 であれば(Gra-> G [分] [I < ディスト[I]) 103 { 104 ディスト[I] = Gra-> G [分] [I]。 105 パス[I] = 分; 106 } 107 } 108 } 109 } 110 111 INT メイン() 112 { 113 グラフGraか= CreateGraph()。 114 プリム(Graか、1 )。 115 INTフラグ= 1 。 116 のためには、(int型 iは= 1 ; iが<= Gra->ネバダ州; iは++ ) 117 であれば(!収集[I]) 118 フラグ= 0 。 119 もし(フラグ) 120 のprintf(" %dの" 、合計)。 121 そう 122 のprintf(" -1 " )。 123 戻り 0 ; 124 }