最短路上的统计_解题报告_SSL1500

Description

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

Input

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

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

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

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

Output

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

Sample Input

5 6

1 2

1 3

2 3

2 4

3 5

4 5

3

2 5

5 1

2 4

 

Sample Output

4

3

2

 

Hint

范围:n<=100,p<=5000

 

思路:

较水。先用floyd求两两点最短路,枚举并找到两条路权值相加等于第三条路的权值的点累计数组s。比较坑爹的是要算上起始点和结束点,机智如我仍然wa几多。

 

源代码:

var
  f,s:array[1..100,1..100]of longint;
  n,m:longint;
procedure init;
var
  i,j,x,y:longint;
begin
  fillchar(f,sizeof(f),$7f div 3);
  readln(n,m);
  for i:=1 to m do
  begin
    readln(x,y);
    f[x,y]:=1;
    f[y,x]:=1;
  end;
end;
procedure main;
var
  i,j,k:Longint;
begin
  for k:=1 to n do
  for i:=1 to n do
  for j:=1 to n do
  if (i<>j)and(k<>i)and(j<>k)and(f[i,k]+f[k,j]<f[i,j]) then
  f[i,j]:=f[i,k]+f[k,j];
  for k:=1 to n do
  for i:=1 to n do
  for j:=1 to n do
  if (i<>j)and(k<>i)and(j<>k)and(f[i,k]+f[k,j]=f[i,j]) then
  inc(s[i,j]);
end;
procedure print;
var
  i,t,x,y:Longint;
begin
  readln(t);
  for i:=1 to t do
  begin
    readln(x,y);
    writeln(s[x,y]+2);
  end;
end;
begin
  init;
  main;
  print;
end.


你可能感兴趣的:(最短路上的统计_解题报告_SSL1500)