時間限制:1000 ms | 記憶體限制:65535 kb
難度:4 描述
南陽理工學院要進行用電線路改造,現在校長要求設計師設計出一種佈線方式,該佈線方式需要滿足以下條件:
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輸出
每組測試資料輸出乙個正整數,表示鋪設滿足校長要求的線路的最小花費。
樣例輸入
1
4 61 2 10
2 3 10
3 1 10
1 4 1
2 4 1
3 4 1
1 3 5 6
樣例輸出
4
**
[張云聰]原創
題目分析:
典型的最小生成數問題
第一種kruskal演算法
其實kruskal演算法就是並查集聯通路問題只不過現在每個邊有了價值權值
克魯斯卡爾(kruskal)演算法(只與邊相關)
演算法描述:克魯斯卡爾演算法需要對圖的邊進行訪問,所以克魯斯卡爾演算法的時間複雜度只和邊又關係,可以證明其時間複雜度為o(eloge)。
演算法過程:
1.將圖各邊按照權值進行排序
3.遞迴重複步驟1,直到找出n-1條邊為止(設圖有n個結點,則最小生成樹的邊數應為n-1條),演算法結束。得到的就是此圖的最小生成樹。
克魯斯卡爾(kruskal)演算法因為只與邊相關,則適合求稀疏圖的最小生成樹。而prime演算法因為只與頂點有關,所以適合求稠密圖的最小生成樹。
#include#include#include#include#includeusing namespace std;
typedef struct nodeedge;
edge edge[260000];
int f[550];
int find(int x)
int m,minn=int_max;
int num,road,sum;
void kruskal()
sort(edge,edge+road,cmp);
for(int i=0;i<=num;i++)
f[i]=i;
kruskal();
printf("%d\n",sum);
} return 0;
}
limits.h 標頭檔案裡包含了資料最值資料
標準庫
第二種 prime演算法
最小生成樹prime演算法詳解
#include #include #include #include #include #define inf 0x3f3f3f3f
using namespace std;
const int maxn=500+20;
int map[maxn][maxn],mark[maxn],dist[maxn];
int v,e;
int prime()
for(int i=1;i<=e;i++)
int m,minn=int_max;
for(int j=1;j<=v;j++)
printf("%d\n",prime()+minn);
}return 0;
}
nyoj 38 佈線問題
nyoj 38 佈線問題 時間限制 1000 ms 記憶體限制 65535 kb難度 4 描述 南陽理工學院要進行用電線路改造,現在校長要求設計師設計出一種佈線方式,該佈線方式需要滿足以下條件 1 把所有的樓都供上電。2 所用電線花費最少 輸入第一行是乙個整數n表示有n組測試資料。n 5 每組測試資...
佈線問題 nyoj38
時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述 南陽理工學院要進行用電線路改造,現在校長要求設計師設計出一種佈線方式,該佈線方式需要滿足以下條件 1 把所有的樓都供上電。2 所用電線花費最少 輸入第一行是乙個整數n表示有n組測試資料。n 5 每組測試資料的第一行是兩個整數v,...
NYOJ 38 佈線問題
時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述 南陽理工學院要進行用電線路改造,現在校長要求設計師設計出一種佈線方式,該佈線方式需要滿足以下條件 1 把所有的樓都供上電。2 所用電線花費最少 輸入第一行是乙個整數n表示有n組測試資料。n 5 每組測試資料的第一行是兩個整數v,...