Prim計算最小生成樹權值 C語言

2022-06-18 04:45:10 字數 1525 閱讀 7031

現在,你被委託在乙個廣闊區域裡面為某些確定的結點設計連線網路。首先,你會給定在區域裡面的一系列結點,和連線這些結點的一組線路。對於每條可能使用的線路,你能得到鋪設該線路所需要的線纜長度。需要注意的是,在兩個給定的結點之間可能存在許多路徑。另外,假設給定的線路必定會連線(直接或間接)該區域裡面的2個結點。

你的任務是為該區域設計乙個網路,使得該區域中的任意2個結點之間都存在(直接或間接的)連線(也就是說,所有給定的結點之間都是連通的,但不一定存在直接相連的線路),同時,使得鋪設該網路的線纜總長度最小。

輸入由多個測試構成。每個測試定義乙個要求的網路。每個測試的第乙個包含2個整數:第乙個整數p給定區域內結點的數目,第二個整數r給出了線路的數目。接下來的r行,給出了兩個結點之間的線路,每行包含3個整數:前2個數字表示線路連線的結點,第三個整數表示鋪設該線路需要的線纜長度。每個整數之間用乙個空格隔開。只給出乙個整數p=0的測試表示輸入結束。每個測試之間用乙個空行隔開。

輸入的最大的結點數目是50。給定的線路的最大長度是100。但是,可能存在的線路數目是無限的。給定的結點由整數1~p來標識(包含p)。需要注意,結點i和j之間的線路可能由i到j的線路來表示,也可能由j到i的線路來表示。

對於每乙個測試,在單獨的一行輸出乙個數字,表示為鋪設整個網路所需要的線纜總長度。

1 0

2 31 2 37

2 1 17

1 2 68

3 71 2 19

2 3 11

3 1 7

1 3 5

2 3 89

3 1 91

1 2 32

5 71 2 5

2 3 7

2 4 8

4 5 11

3 5 10

1 5 6

4 2 12

0

0

1716

26

#include #define maxvertex 52

#define maxedge 102

#define inf 1e7

//prim演算法計算最小生成樹的權值

int prim(int matrix[maxvertex],int vnum, int ednum)}}

} mst = mst + min;

isintree[temp1] = 1;

isintree[temp2] = 1;

} return mst;

}int main()

//矩陣初始化

int matrix[maxvertex][maxvertex] ;

for(int i = 0; i <= vnum; i++)

} //輸入邊 邊權 且 同一條邊只保留最小邊權

for(int i = 0; i < ednum; i++)

}

//prim演算法+輸出

printf("%d\n",prim(matrix,vnum,ednum));

}}

最小生成樹 Prim

include stdio.h include stdlib.h include io.h include math.h include time.h define ok 1 define error 0 define true 1 define false 0 define maxedge 20 ...

最小生成樹 prim

演算法模型 由任意乙個頂點開始 將此頂點存入s集,剩餘頂點存入t集合 每次遍歷頂點,取一條能夠連線s與t最短邊e,直到所有頂點全部加入s include include define inf 1 30 int n,m,vis 110 low 110 int map 110 110 int init ...

最小生成樹 PRIM

這個是有關普利姆的演算法,從乙個點出發,找出與這個點相連的所有點的對應的權值最小的那個,然後再把這個點從集合中劃掉。模板如下 include include define inf 0xfffff define max 2005 using namespace std int map max max ...