問題描述
雷雷承包了很多片麥田,為了灌溉這些麥田,雷雷在第乙個麥田挖了一口很深的水井,所有的麥田都從這口井來引水灌溉。
為了灌溉,雷雷需要建立一些水渠,以連線水井和麥田,雷雷也可以利用部分麥田作為「中轉站」,利用水渠連線不同的麥田,這樣只要一片麥田能被灌溉,則與其連線的麥田也能被灌溉。
現在雷雷知道哪些麥田之間可以建設水渠和建設每個水渠所需要的費用(注意不是所有麥田之間都可以建立水渠)。請問灌溉所有麥田最少需要多少費用來修建水渠。
輸入格式
輸入的第一行包含兩個正整數n, m,分別表示麥田的片數和雷雷可以建立的水渠的數量。麥田使用1, 2, 3, ……依次標號。
接下來m行,每行包含三個整數a
i, b
i, c
i,表示第a
i片麥田與第b
i片麥田之間可以建立一條水渠,所需要的費用為c
i。輸出格式
輸出一行,包含乙個整數,表示灌溉所有麥田所需要的最小費用。
樣例輸入
4 4
1 2 1
2 3 4
2 4 2
3 4 3
樣例輸出
6樣例說明
建立以下三條水渠:麥田1與麥田2、麥田2與麥田4、麥田4與麥田3。
評測用例規模與約定
前20%的評測用例滿足:n≤5。
前40%的評測用例滿足:n≤20。
前60%的評測用例滿足:n≤100。
所有評測用例都滿足:1≤n≤1000,1≤m≤100,000,1≤c
i≤10,000。
————————————————————————————————————————————
很明顯的最小生成樹問題,從乙個頂點出發構成一顆樹,使用prime算演算法。只需要設計好儲存方式避免超時。
程式中使用node[i][j]記錄節點i和j之間修建水渠的費用,初始化為無窮大。用in[i]表示節點i是否已經加入最小生成樹種,當in[i]==1時表示已經加入,in[i]==0表示未加入。to[j]表示到達節點j當前可選的路徑中最短的距離,初始化都為無窮大。每次從to[i]中選乙個費用最小的且未加入最小生成樹的節點,加入最小生成樹,並從新加入的節點出發,更新to。
**如下:
#include#includeusing namespace std;
#define maxx 1010
#define inf 0x3f3f3f3f //無窮大
int node[maxx][maxx];
int in[maxx];
int to[maxx];
int n,nn,m;
long long num;
void prime()
nn = n;
for(int k=0;k> n >> m;
memset(node,inf,sizeof(node));//初始化各點間距離無限大
memset(to,inf,sizeof(to));
for(int i=0;i> x >> y >> v;
node[x][y] = v;
node[y][x] = v;
} prime();//prime演算法構造最小生成樹
cout << num;
return 0;
}
CCF201412 4 最優灌溉 最小生成樹
傳送門 ccf201412 4 最優灌溉 很水的模板題。不過後來發現了並查集的按秩合併優化,但據說優化效果不咋地,所以這裡挖個坑,以後來補。下面上 基本上可以當作kruskal的板子用了 include define ll long long define inf 0x3f3f3f3f using ...
最小生成樹 最優佈線問題
題目描述 學校有n臺計算機,為了方便資料傳輸,現要將它們用資料線連線起來。兩台計算機被連線是指它們之間有資料線連線。由於計算機所處的位置不同,因此不同的兩台計算機的連線費用往往是不同的。當然,如果將任意兩台計算機都用資料線連線,費用將是相當龐大的。為了節省費用,我們採用資料的間接傳輸手段,即一台計算...
hpuoj 最優規劃(最小生成樹)
有很多城市之間已經建立了路徑,但是有些城市之間沒有路徑聯通。為了聯通所有的城市,現在需要新增一些路徑,為了節約,需要滿足新增總路徑是最短的。第一行 3 個整數 n,m,s,分別表示城市的數量 已經存在的路的數量 可修的路的數量。之後的 m 行,每行 3 個整數 x,y,d,表示點 x 到點 y 有一...