【测试】【最小生成树】图论专题训练--造路行动

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

 

 

 

posted @ 2012-08-19 19:57  jiangzh  阅读(300)  评论(0编辑  收藏  举报