最短路计数

来源:互联网 发布:ssc源码论坛 编辑:程序博客网 时间:2024/05/16 05:27

题意:

一个无向图上,没有自环,所有边的权值均为1,对于一个点对(a,b),我们要把所有a与b之间所有最短路上的点的总个数输出。

思路:

总数:
方程:if dis[k]+map[k,j]=dis[j] then inc(dis[k]);

所有最短路经过的点数之和:
先求出floyd,然后:
if dis[i,k]+dis[k,j]=dis[i,j] then inc(ans[i,j]);
1<=k,i,j<=n,
好像这是最简单的方法,只能用于数据小的时候。

const maxn=100;var a,f:array [1..maxn,1..maxn] of longint; i,j,n,m,x,y,k,p:longint;begin fillchar(a,sizeof(a),$7); readln(n,m); for i:=1 to m do begin  readln(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,j]>a[i,k]+a[k,j] then    a[i,j]:=a[i,k]+a[k,j]; for k:=1 to n do  for i:=1 to n do   for j:=1 to n do   if a[i,j]=a[i,k]+a[k,j] then    inc(f[i,j]); readln(p); for i:=1 to p do begin  readln(x,y);  writeln(f[x,y]+2); end;end.
0 0