【测试】【最小生成树】图论专题训练--造路行动
题目:造路行动(road.pas/cpp/in/out)
题目描述
学校某日突发奇想,要造个小公园。但是,公园造造简单,最麻烦的就是路了。学校张榜:谁设计一个方案,材料费最小,那么,他就获得1000奖学金。鄙人想去,但是作业铺天盖地,根本没时间啊。只好到网上来求助……
各路英雄,帮帮忙吧。
输入格式
第1行,二个数,N,M。N表示公园有N个景点,M表示规划的可以造路的路的条数
接下来M行,每行3个数:X,Y,A。表示第X个景点和第Y个景点之间可以造路,材料费为A。(第X个景点和第Y个景点之间可以造路,也就是说第Y个景点和第X个景点之间也可以造路)。
当然,不会出现孤立的景点。
数据范围:0 <N<=1000,0 <M<=N*(N-1),0 <X,Y<=N,0 <A<32768。
输出格式
一个数,表示最少的材料费。
样例输入
8 13
1 7 1
1 2 9
1 6 9
2 8 2
2 3 9
3 8 3
3 4 9
4 8 4
4 5 9
5 7 5
5 6 9
6 7 6
7 8 7
样例输出
28
很裸的一个最小生成树,是送分题
Pascal Code
program road; const maxn=1000+10; var n,m:longint; map:array[0..maxn,0..maxn] of longint; dist:array[0..maxn] of longint; h:array[0..maxn] of boolean; procedure init; begin assign(input,'road.in'); assign(output,'road.out'); reset(input); rewrite(output); end; procedure outit; begin close(input); close(output); halt; end; procedure readdata; var i,x,y,z:longint; begin fillchar(map,sizeof(map),$7); read(n,m); for i:=1 to m do begin read(x,y,z); if map[x,y]>z then begin map[x,y]:=z; map[y,x]:=map[x,y]; end; end; end; procedure prim; var i,j,k,min,total:longint; begin total:=0; for i:=1 to n do begin //find min k:=0;min:=maxlongint; for j:=1 to n do if (not h[j])and(dist[j]<min) then begin k:=j;min:=dist[j]; end; //hash //writeln(k:5,' -->',dist[k]:10); h[k]:=true; //join inc(total,dist[k]); for j:=1 to n do if (not h[j])and(dist[j]>map[k,j]) then dist[j]:=map[k,j]; end; writeln(total); end; procedure main; begin fillchar(dist,sizeof(dist),$7); dist[1]:=0; prim; end; begin init; readdata; main; outit; end.
..... 转载请注明出处 ..... http://oijzh.cnblogs.com ..... by jiangzh