您的位置:首页 > 其它

poj3159 Candies 2012-09-07

2016-03-02 20:59 253 查看
http://poj.org/problem?id=3159

差分约束系统

(spfa+
队列)会TLE,(spfa+stack)可以过,不过有点奇葩的是建边时 输入 (a,b,c) 如果连边 w(b,a)=c 然后
做 spfa(n),输出dis[1]会超时。反过来 连边 w(a,b)=c,然后做spfa(1),输出dis
就484Ms过了。数据比较坑
爹吧。

Program poj3159;

type cord=record

ne,da,po:longint;

end;

var n,m,le,tot:longint;

head,dis:array[1..30000]of longint;

h,v:array[1..200000]of longint;

f:array[1..30000]of boolean;

link:array[1..200000]of cord;

Procedure add(x,y,z:longint);

begin

inc(le);

with link[le] do

begin

po:=y;

da:=z;

ne:=head[x];

end;

head[x]:=le;

end;

Procedure init;

var i,j,k,l:longint;

begin

readln(n,m);

for i:=1 to m do

begin

readln(j,k,l);

add(j,k,l);

end;

end;

Procedure spfa(x:longint);

var i,j,k,t:longint;

begin

for i:=1 to n do dis[i]:=maxlongint div 3;

dis[x]:=0;

h[1]:=x;

f[x]:=true;

t:=1;

repeat

k:=h[t];

dec(t);

f[k]:=false;

i:=head[k];

while i<>0 do

begin

if dis[k]+link[i].da<dis[link[i].po] then

begin

dis[link[i].po]:=dis[k]+link[i].da;

if f[link[i].po]=false then

begin

f[link[i].po]:=true;

inc(t);

h[t]:=link[i].po;

end;

end;

i:=link[i].ne;

end;

until  t=0;

end;

Procedure main;

var i,j:longint;

begin

spfa(1);

writeln(dis
);

end;

Begin

init;

main;

end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: