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