您的位置:首页 > 其它

【SSLGZ 1500】最短路上的统计

2016-12-17 11:14 190 查看
问题描述

求从i到j最短路上的顶点数。

输入

第一行n,m,表示n个点,m条边

接下来m行,每行两个数a,b,表示a,b之间有条边

在下来一个数p,表示问题的个数

接下来p行,每行两个数a,b,表示询问a,b

输出

对于每个询问,输出一个数c,表示a,b之间最短路上点的总个数

样例输入

5 6

1 2

1 3

2 3

2 4

3 5

4 5

3

2 5

5 1

2 4

样例输出

4

3

2

算法讨论

先求出最短路径,然后对于每个询问,若a[i,k]+a[k,j]=a[i,j],那么k就是这条最短路上的一点,加入数组s[i,j],注意s[i,j]初值要赋为2,因为i,j也是路上点

const
maxn=100;
var
a,s:array[1..maxn,1..maxn] of longint;
i,j,k,n,m,p,x,y:longint;
begin
read(n,m);
for i:=1 to n do
for j:=1 to n do
a[i,j]:=maxlongint div 3;
for i:=1 to m do
begin
read(x,y);
a[x,y]:=1;
a[y,x]:=1
end;
for k:=1 to n do
for i:=1 to n do
for j:=1 to n do
if a[i,k]+a[k,j]<a[i,j]
then a[i,j]:=a[i,k]+a[k,j];
read(p);
for i:=1 to p do
begin
read(x,y);
s[x,y]:=2;
for j:=1 to n do
if (x<>j) and (y<>j) and (a[x,j]+a[j,y]=a[x,y])
then inc(s[x,y]);
writeln(s[x,y])
end;
end.




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