chocolate giving[usaco2010 Feb]

来源:互联网 发布:淘宝牛仔女裤 编辑:程序博客网 时间:2024/03/29 19:40

思路很简单,显然是spfa求最短路

但需要注意

1.用指针#chocolate giving [usaco2010 Feb]储存信息,不要用数组,会炸空间。
2.队列q长度要开大些,2*n+10较为合适。
3.好吧,是道水题,贴代码…

type pp=^node;      node=record      dot,v:longint;      next:pp;      end;const maxn=50006;var dis:array[0..maxn]of longint;      q:array[0..2*maxn+20]of longint;    a:array[0..maxn]of pp;    f:array[0..maxn]of boolean;    n,m,b,head,tail,u,v,x,y,i,j,l,w:longint;    p:pp;begin    {assign(input,'cgiving.in');assign(output,'cgiving.out');    reset(input);rewrite(output);}    readln(n,m,b);    for i:=1 to n do    begin       new(a[i]);       a[i]^.next:=nil;    end;    for i:=1 to n do dis[i]:=maxlongint div 3;    for i:=1 to m do    begin        readln(x,y,l);        new(p);p^.next:=a[x]^.next;        p^.dot:=y;p^.v:=l;a[x]^.next:=p;        new(p);p^.next:=a[y]^.next;        p^.dot:=x;p^.v:=l;a[y]^.next:=p;    end;    fillchar(q,sizeof(q),0);fillchar(f,sizeof(f),false);    f[1]:=true;q[1]:=1;head:=0;dis[1]:=0;head:=0;tail:=1;    repeat       inc(head);u:=q[head];p:=a[u];       while p^.next<>nil do       begin           p:=p^.next;           v:=p^.dot;w:=p^.v;           if dis[v]>dis[u]+w then           begin               dis[v]:=dis[u]+w;               if not f[v] then               begin                   inc(tail);q[tail]:=v;                   f[v]:=true;               end;           end;       end;       f[u]:=false;    until head>=tail;    for i:=1 to b do    begin        readln(x,y);        writeln(dis[x]+dis[y]);    end;    //close(input);close(output);end.
1 0
原创粉丝点击