P3408: [Usaco2009 Oct]Heat Wave 热浪

水题,裸的最短路。

const maxn=6200001;
type
  link=^node;
  node=record
    t,d:longint;
    f:link;
  end;
var n,m,s,i,j,u,v,w,max:longint;
adj:array[0..3000] of link;
f:array[0..1000000] of longint;
d,val:array[0..3000] of longint;
went:array[0..3000] of boolean;
procedure insert(f,t,d:longint);
var p:link;
begin
  new(p);
  p^.f:=adj[f];
  p^.t:=t;
  p^.d:=d;
  adj[f]:=p;
end;
procedure spfa(s:longint);
var l,r,now,i:longint;
p:link;
begin
  for i:=1 to n do
    d[i]:=maxn;
  fillchar(went,sizeof(went),true);
  l:=1; r:=1; f[1]:=s; d[s]:=0; went[s]:=false;
  while l<=r do
    begin
      now:=f[l];
      p:=adj[now];
      while p<>nil do
        begin
          if d[p^.t]>d[now]+p^.d then
            begin
              d[p^.t]:=d[now]+p^.d;
              if went[p^.t] then
                begin
                  went[p^.t]:=false;
                  inc(r);
                  f[r]:=p^.t;
                end;
            end;
          p:=p^.f;
        end;
      went[now]:=true;
      inc(l);
    end;
end;
begin
  readln(n,m,s);
  for i:=1 to m do
    begin
      readln(u,v,w);
      insert(u,v,w);
      //insert(v,u,w);
    end;
  for i:=1 to n do
    if i<>s then
      begin
        spfa(i);
        val[i]:=d[s];
      end;
  spfa(s);
  for i:=1 to n do
    if i<>s then
      begin
        inc(val[i],d[i]);
        if val[i]>max then max:=val[i];
      end;
  writeln(max);
end.

 (转载请注明出处:http://www.cnblogs.com/Kalenda/)

 

转载于:https://www.cnblogs.com/Kalenda/p/4814045.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值