最短路计数

题意:

一个无向图上,没有自环,所有边的权值均为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.

你可能感兴趣的:(最短路)