[POJ3013]细节spfa

这题……TAT

11402985HTwood3013Accepted10844K1032MSPascal2009B2013-03-27 21:21:10
11402592HTwood3013Wrong Answer  Pascal1995B2013-03-27 20:32:18
11402558HTwood3013Wrong Answer  Pascal1998B2013-03-27 20:28:47
11402487HTwood3013Wrong Answer  Pascal1998B2013-03-27 20:20:43
11402470HTwood3013Wrong Answer  Pascal2000B2013-03-27 20:18:05
11402420HTwood3013Wrong Answer  Pascal1968B2013-03-27 20:12:43
11402417HTwood3013Wrong Answer  Pascal1994B2013-03-27 20:12:06
11402408HTwood3013Wrong Answer  Pascal2851B2013-03-27 20:10:27
11402396HTwood3013Wrong Answer  Pascal2853B2013-03-27 20:08:00
11402302HTwood3013Wrong Answer  Pascal2729B2013-03-27 19:55:34
11402243HTwood3013Wrong Answer  Pascal2729B2013-03-27 19:47:10
11402229HTwood3013Wrong Answer  Pascal2710B2013-03-27 19:45:26
11402220HTwood3013Wrong Answer  Pascal2712B2013-03-27 19:43:43
11402204HTwood3013Wrong Answer  Pascal2718B2013-03-27 19:41:33
11402186HTwood3013Wrong Answer  Pascal2731B2013-03-27 19:39:06
11402172HTwood3013Runtime Error  Pascal2724B2013-03-27 19:35:52
11402170HTwood3013Runtime Error  Pascal2724B2013-03-27 19:35:27
11402137HTwood3013Wrong Answer  Pascal2644B2013-03-27 19:29:52

 

1、用int64存储信息
2、似乎edge要开200000
3、n=0或1时输出0
4、确认你的spfa没写错,访问下一个节点前先对当前节点置v[x]=true(环!),最后置为false
5、最后检验时要记得从i=2时开始检验
6、inf要是1<<61左右,太大会爆,太小不行
7、双向边,重边
program p3013;

Type
 rec=record
   e,w,next:int64;
 end;

Var
 a:array[0..200002] of rec;
 b,g,q,dt:array[0..200002] of int64;
 v:array[0..200002] of boolean;
 n,m,t,top,ans,st,ed,ww:int64;
 i:longint;
 ok:boolean;

Procedure fopen;
  begin
  assign(input,'p3013.in');
  assign(output,'p3013.out');
  reset(input);
  rewrite(output);
end;

Procedure fclose;
  begin
  close(input);
  close(output);
end;

Procedure Add(ss,ee,ww:longint);
  begin
  inc(top);
  with a[top] do
    begin
    next:=b[ss];
    e:=ee;
    w:=ww;
  end;
  b[ss]:=top;
end;

Procedure spfa;
var
 close,open,o,x:int64;
 y:rec;
 i:longint;
  begin
  fillchar(v,sizeof(v),false);
  fillchar(q,sizeof(q),0);
  for i:=1 to 200000 do dt[i]:=1 shl 61;
  dt[1]:=0;
  v[1]:=true;
  close:=0;open:=1;
  q[1]:=1;
  while close<>open do
    begin
    close:=close mod n+1;
    x:=q[close];v[x]:=true;
    //v[x]:=false;
    o:=b[x];
    while o<>0 do
      begin
      y:=a[o];
      o:=y.next;
      with y do
        begin
        if dt[e]>dt[x]+w then
          begin
          dt[e]:=dt[x]+w;
        if not v[e] then
          begin
          open:=open mod n+1;
          q[open]:=e;
          v[e]:=true;
        end;
        end;
      end;
    end;
    //writeln('x=',x);
    v[x]:=false;
  end;
end;
  

  begin

  readln(t);

  while t>0 do
    begin
    top:=0;
    dec(t);
    readln(n,m);
    fillchar(a,sizeof(a),0);
    fillchar(b,sizeof(b),0);
    for i:=1 to n do
      read(g[i]);
    for i:=1 to m do
      begin
      read(st,ed,ww);
      //if st=ed then continue;
      Add(st,ed,ww);
      Add(ed,st,ww);
    end;
    if (n<2) then writeln(0) else begin
    //prepare;
      spfa;
      ans:=0;
      ok:=true;
      for i:=2 to n do if  dt[i]<1 shl 61 then ans:=ans+dt[i]*g[i] else begin ok:=false; writeln('No Answer');break;end;
      if ok then writeln(ans); end;
      
   
  end;

end.

 

转载于:https://www.cnblogs.com/htfy/archive/2013/03/27/2985429.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值