洛谷_P1144_最短路计数

题目大意:

给出一个 N 个顶点 M 条边的无向无权图,顶点编号为 1-N。问从顶点 1 开始,到其他每个点的最短路有几条。

题解:

更新边长的时候如果大于号就覆盖,有相同最短路径就相加。

代码:

 1 const
 2   mo=100003;
 3 type
 4   arr=record
 5     y,next:longint;
 6   end;
 7 var
 8   n,m,nm:longint;
 9   a:array [0..4000001] of arr;
10   ls,d,ans,list,v:array [0..1000001] of longint;
11 procedure add(x,y:longint);
12 begin
13   inc(nm);
14   a[nm].y:=y; a[nm].next:=ls[x]; ls[x]:=nm;
15 end;
16 
17 procedure init;
18 var
19   i,x,y:longint;
20 begin
21   readln(n,m);
22   for i:=1 to m do
23     begin
24       readln(x,y);
25       add(x,y); add(y,x);
26     end;
27 end;
28 
29 procedure spfa;
30 var
31   head,tail,i,x:longint;
32 begin
33   fillchar(d,sizeof(d),63);
34   head:=0; tail:=1;
35   list[1]:=1; d[1]:=0; ans[1]:=1;
36   repeat
37     inc(head);
38     x:=list[head];
39     i:=ls[x];
40     while i<>0 do
41       with a[i] do
42         begin
43           if d[x]+1<d[y] then
44             begin
45               d[y]:=d[x]+1;
46               ans[y]:=ans[x];
47               if v[y]=0 then
48                 begin
49                   inc(tail);
50                   list[tail]:=y;
51                   v[y]:=1;
52                 end;
53             end else
54             if d[y]=d[x]+1 then
55               ans[y]:=(ans[y]+ans[x]) mod mo;
56           i:=next;
57         end;
58     v[x]:=0;
59   until head>tail;
60 end;
61 
62 procedure print;
63 var
64   i:longint;
65 begin
66   for i:=1 to n do
67     writeln(ans[i]);
68 end;
69 
70 begin
71   init;
72   spfa;
73   print;
74 end.

猜你喜欢

转载自www.cnblogs.com/zyx-crying/p/9498518.html