题目大意:
一个无向图上,有N个点,M条边,每条边表示a,b之间有一条边,没有自环,所有边的权值均为1。有p个询问,对于一个点(a,b),求所有a与b之间所有最短路上的点的总个数。
n<=100,p<=5000
题解:
floyd+枚举:
1.首先二话不说floyd求出任意2点之间的最短路。
2.枚举N个点,以第i个点为断点,判断i连接a,b两点组成的最短路是否与已求的的a,b之间的最短路相同花费,相同就给答案累加1。
时间复杂度:O(N^3)
var
f:array [0..101,0..101] of longint;
x,y,i,j,k,n,m,p,ans:longint;
begin
readln(n,m);
for i:=1 to n do
begin
for j:=1 to n do f[i,j]:=maxlongint div 2;
f[i,i]:=0;
end;
for i:=1 to m do
begin
readln(x,y);
f[x,y]:=1;
f[y,x]:=1;
end;
for k:=1 to n do
for i:=1 to n do
for j:=1 to n do
if (i<>j) and (i<>k) and (k<>j) then
if f[i,j]>f[i,k]+f[k,j] then f[i,j]:=f[i,k]+f[k,j];
readln(p);
for i:=1 to p do
begin
readln(x,y);
ans:=0;
for j:=1 to n do
if f[x,j]+f[j,y]=f[x,y] then inc(ans);
writeln(ans);
end;
end.