佈線問題
- 描述
- 南陽理工學院要進行用電線路改造,現在校長要求設計師設計出一種佈線方式,該佈線方式需要滿足以下條件:
1、把所有的樓都供上電。
2、所用電線花費最少
- 輸入
- 第一行是一個整數n表示有n組測試數據。(n<5)
每組測試數據的第一行是兩個整數v,e.
v表示學校裏樓的總個數(v<=500)
隨後的e行裏,每行有三個整數a,b,c表示a與b之間如果建鋪設線路花費爲c(c<=100)。(哪兩棟樓間如果沒有指明花費,則表示這兩棟樓直接連通需要費用太大或者不可能連通)
隨後的1行裏,有v個整數,其中第i個數表示從第i號樓接線到外界供電設施所需要的費用。( 0<e<v*(v-1)/2 )
(樓的編號從1開始),由於安全問題,只能選擇一個樓連接到外界供電設備。
數據保證至少存在一種方案滿足要求。 - 輸出
- 每組測試數據輸出一個正整數,表示鋪設滿足校長要求的線路的最小花費。
- 樣例輸入
-
1 4 6 1 2 10 2 3 10 3 1 10 1 4 1 2 4 1 3 4 1 1 3 5 6
- 樣例輸出
-
4
最小生成樹算法實現:
intree表示是否在樹中, dis數組表示樹到點的最小邊值, 每次只更新新入的邊的鄰接點的值, 如果此點不在樹中, 並且邊的值比數組中原來的值小, 就更新, 然後遍歷整個數組, 尋找不在樹中的, 而且 距離樹最小的點
代碼:
一定要將freopen註釋掉再提交
#include<iostream> using namespace std; #include<stdio.h> #include<string.h> #include<vector> #define N 501 #define Max 200 typedef struct{ int v; int w; }edge; vector<edge> graph[N]; int degree[N]; int nvertices, nedges; int min1; int dis[N]; int intree[N]; void read(); void prime(); void print(); int main(){ int out, n; // freopen("in.txt", "r", stdin); scanf("%d", &n); while(n--){ out = 0; read(); prime(); for(int i = 1; i <= nvertices; i++){ out += dis[i]; } printf("%d\n", out + min1); } return 0; } void read(){ int a, b, c, i; edge e; scanf("%d%d", &nvertices, &nedges); //printf("%d\t%d\n", nvertices, nedges); for(i = 0; i < N; i++){//清空vector graph[i].clear(); } while(nedges--){ scanf("%d%d%d", &a, &b, &c); e.v = b; e.w = c; graph[a].push_back(e); e.v = a; e.w = c; graph[b].push_back(e); //輸入一個數 } min1 = 63000; i = nvertices; while(i--){ scanf("%d", &a); min1 = min1 < a ? min1 : a; } } void prime(){ int i, j, v, len, w; memset(intree, 0, sizeof(intree));//初始化數組 for(i = 0; i <= N; i++ ){ dis[i] = Max; } int s = 1;//設爲從1開始出發找生成樹 dis[s] = 0; while(intree[s] == 0){//此點不在樹中 intree[s] = 1; len = graph[s].size(); for(i = 0; i < len; i++){ v = graph[s][i].v; w = graph[s][i].w; if(intree[v] == 0 && dis[v] > w){//更新不在樹中的鄰接點 dis[v] = w; } } /* for(i = 1; i <= nvertices; i++){ printf("%d\t", dis[i] ); } printf("\n"); */ int disk = Max; for(i = 1; i <= nvertices; i++){//尋找和樹相連的權最小的點 if(intree[i] == 0 && disk > dis[i]){ s = i; disk = dis[i]; } } } }