P1631: [Usaco2007 Feb]Cow Party

还是水题,接近于裸的spfa(个人比较喜欢用spfa,dijkstra不太喜欢用),代码附上

 1 const maxn=6200001;
 2 type
 3   link=^node;
 4   node=record
 5     t,d:longint;
 6     f:link;
 7   end;
 8 var n,m,s,i,j,u,v,w,max:longint;
 9 adj:array[0..3000] of link;
10 f:array[0..1000000] of longint;
11 d,val:array[0..3000] of longint;
12 went:array[0..3000] of boolean;
13 procedure insert(f,t,d:longint);
14 var p:link;
15 begin
16   new(p);
17   p^.f:=adj[f];
18   p^.t:=t;
19   p^.d:=d;
20   adj[f]:=p;
21 end;
22 procedure spfa(s:longint);
23 var l,r,now,i:longint;
24 p:link;
25 begin
26   for i:=1 to n do
27     d[i]:=maxn;
28   fillchar(went,sizeof(went),true);
29   l:=1; r:=1; f[1]:=s; d[s]:=0; went[s]:=false;
30   while l<=r do
31     begin
32       now:=f[l];
33       p:=adj[now];
34       while p<>nil do
35         begin
36           if d[p^.t]>d[now]+p^.d then
37             begin
38               d[p^.t]:=d[now]+p^.d;
39               if went[p^.t] then
40                 begin
41                   went[p^.t]:=false;
42                   inc(r);
43                   f[r]:=p^.t;
44                 end;
45             end;
46           p:=p^.f;
47         end;
48       went[now]:=true;
49       inc(l);
50     end;
51 end;
52 begin
53   readln(n,m,s);
54   for i:=1 to m do
55     begin
56       readln(u,v,w);
57       insert(u,v,w);
58       //insert(v,u,w);
59     end;
60   for i:=1 to n do
61     begin
62       spfa(i);
63       val[i]:=d[s];
64       //writeln(sb);
65       //writeln(d[s]);
66     end;
67   spfa(s);
68   for i:=1 to n do
69     //if i<>s then
70       begin
71         inc(val[i],d[i]);
72         if val[i]>max then max:=val[i];
73       end;
74   writeln(max);
75 end.

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

 

posted @ 2015-09-16 18:04  LovelyMonster丶  阅读(209)  评论(0编辑  收藏  举报