PTAタイトルセットのデータ構造とアルゴリズム(中国)7-10

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 }
コードの表示

 

おすすめ

転載: www.cnblogs.com/57one/p/11594469.html
おすすめ