作业帮 > 综合 > 作业

铲雪车问题描述大雪履盖了整个城市,市政府要求冬季服务部门尽快将一些街道(列在一份清单中)的积雪清除掉以恢复交通,整个城市

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/05/21 17:04:04
铲雪车问题
描述
大雪履盖了整个城市,市政府要求冬季服务部门尽快将一些街道(列在一份清单中)的积雪清除掉以恢复交通,整个城市由许多交叉路口和街道构成,当然任意两个交叉路口都是直接或间接连通的,清单给出了最少的街道,使得这些街道的积雪清除后任意两个交叉路口之间有且仅有一条通路,冬季服务部门只有一辆铲雪车及一名司机,这辆铲雪车的出发点位于某个交叉路口.
无论街道上有没有积雪,铲雪车每前进一米都要消耗一升燃料,冬季服务部门要求司机在铲除清单上的所有街道的积雪的前提下,要求消耗燃料最少,积雪铲完后车可以停在任意的交叉路口.
输入
第一行包含两个整数N和S,1≤N≤100000,1≤S≤N.N为交叉路口的总数;S为铲雪车出发的路口序号.路口的标号为1?N.
接下来的N-1行为清单上的街道,每一行包含三个用空格隔开的整数A、B、C,表示一条从交叉路口A到交叉路口B的街道,C为该街道的长度,单位为米,1≤C≤1000.
输出
仅一行包含一个整数表示清除所有积雪所需的最少的燃料数量.
样例输入
5 1
1 2 8
1 3 10
3 4 10
4 5 7
样例输出
43
哪位网友能提供标程(pascal),急用!
program one;
  const maxn = 100000;
  maxv = (maxn-1)*2;
  type vtype=record
  b,c,p:longint;
  end;
  var n,s,i,a,b,c,total:longint;
  v:array[1..maxv] of vtype;
  lista:array[1..maxn] of longint;
  p:array[1..maxn] of boolean;
  procedure initfile;
  begin
  assign(input,'one.in');
  reset(input);
  assign(output,'one.out');
  rewrite(output);
  end;
  procedure closefile;
  begin
  close(input);
  close(output);
  end;
  function search(x : longint) : longint;
  var d, max : longint;
  y : longint;
  begin
  p[x]:=true;
  y:=lista[x];
  max:=0;
  while y0 do
  begin
  if not(p[v[y].b]) then
  d:=v[y].c+search(v[y].b)
  else
  d:=0;
  if d>max then max:=d;
  y:=v[y].p;
  end;
  search:=max;
  end;
  begin
  initfile;
  readln(n,s);
  total := 0;
  for i:=1 to n do lista[i]:=0;
  for i:=1 to n-1 do
  begin
  readln(a,b,c);
  total:=total+c;
  v[i*2-1].b:=b;
  v[i*2-1].c:=c;
  v[i*2-1].p:=lista[a];
  lista[a]:=i*2-1;
  v[i*2].b:=a;
  v[i*2].c:=c;
  v[i*2].p:=lista[b];
  lista[b]:=i*2;
  end;
  for i:=1 to n do p[i]:=false;
  total:=total*2-search(s);
  writeln(total);
  closefile;
  end.