题目:造路行动(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.