資料結構小學期第一天

新晋软工小白發表於2024-07-01

今日要完成的任務是最小生成樹(普里姆演算法)

試實現普里姆最小生成樹演算法。

函式介面定義:
void Prim(AMGraph G, char u);
其中 G 是基於鄰接矩陣儲存表示的無向圖,u表示起點

裁判測試程式樣例:
#include <iostream>
#define MVNum 10
#define MaxInt 32767
using namespace std;

struct edge{
char adjvex;
int lowcost;
}closedge[MVNum];

typedef struct{
char vexs[MVNum];
int arcs[MVNum][MVNum];
int vexnum,arcnum;
}AMGraph;
int LocateVex(AMGraph G , char v);//實現細節隱藏
int Min(AMGraph G);//實現細節隱藏
int CreateUDN(AMGraph &G);//實現細節隱藏

void Prim(AMGraph G, char u);

int main(){
AMGraph G;
CreateUDN(G);
char u;
cin >> u;
Prim(G , u);
return 0;
}

/* 請在這裡填寫答案 */
輸入樣例:
第1行輸入結點數vexnum和邊數arcnum。第2行輸入vexnum個字元表示結點的值,接下來依次輸入arcnum行,每行輸入3個值,前兩個字元表示結點,後一個數表示兩個結點之間邊的權值。最後一行輸入一個字元表示最小生成樹的起始結點。

7 9
0123456
0 1 28
0 5 10
1 2 16
1 6 14
2 3 12
3 6 18
3 4 22
4 5 25
4 6 24
0
輸出樣例:
按最小生成樹的生成順序輸出每條邊。

0->5
5->4
4->3
3->2
2->1
1->6

 1 void Prim( AMGraph G, char v )
 2     { 
 3         int distance[G.vexnum];
 4         int parent[G.vexnum];
 5         //記錄v的下標
 6         int index=0;
 7         int i,min=MaxInt,imin,count=0;
 8         // 1.初始化這棵樹,即以v為起始點,同時初始化陣列distance[]
 9         //     注:distance陣列表示該樹的任意一點到該點的最小距離
10 
11         //尋找v的下標
12         for (i = 0; i < G.vexnum; i++)
13         {
14             if (G.vexs[i]==v)
15             {
16                 index=i;
17             }
18             
19         }
20         for (i = 0; i < G.vexnum; i++)
21         {
22             if (i==index)
23             {
24                 distance[i]=0;
25                 parent[i]=index;
26             }else
27             {
28                 distance[i]=G.arcs[index][i];
29                 parent[i]=index;
30             }       
31         }
32         while (1)
33         {
34             if (count==G.vexnum-1)
35             {
36                 break;
37             }
38             
39             // 2.從小樹現有的結點出發,尋找邊權值最小的點:
40             for ( i = 0; i < G.vexnum; i++){
41                 if (min>distance[i]&&distance[i]!=0)
42                 {
43                     //記錄最小值及其下標
44                     min=distance[i];
45                     imin=i;
46                     
47                 }
48                 
49             }
50             //更新已到達過得節點數
51             
52             count++;
53             // 3.找到後輸出該邊
54             if (count<G.vexnum-1)
55             {
56                 printf("%c->%c\n",G.vexs[parent[imin]],G.vexs[imin]);
57             }else
58             {
59                 printf("%c->%c",G.vexs[parent[imin]],G.vexs[imin]);
60             }
61             
62             
63             
64             
65             //初始化min以便下次尋找
66             min=MaxInt;
67             // 4.將該點的distance陣列中的值賦值為0,標記已經遍歷過
68             distance[imin]=0;
69             // 5.迴圈遍歷結點,更新distance[]陣列
70             for ( i = 0; i < G.vexnum; i++){
71                 if (distance[i]!=0&&G.arcs[i][imin]<MaxInt)
72                 {
73                     if (distance[i]>G.arcs[i][imin])
74                     {
75                         distance[i]=G.arcs[i][imin];
76                         parent[i]=imin;
77                     }                   
78                 }
79             }            
80         }
81     }

相關文章