述 Description | |||
一个无向图上,没有自环,所有边的权值均为1,对于一个点对(a,b),我们要把所有a与b之间所有最短路上的点的总个数输出。 | |||
输入格式 Input Format | |||
第一行n,m,表示n个点,m条边 接下来m行,每行两个数a,b,表示a,b之间有条边 在下来一个数p,表示问题的个数 接下来p行,每行两个数a,b,表示询问a,b | |||
输出格式 Output Format | |||
对于每个询问,输出一个数c,表示a,b之间最短路上点的总个数 | |||
![]() | ![]() | ||
样例输入 Sample Input | |||
样例输出 Sample Output | |||
时间限制 Time Limitation | |||
1s | |||
注释 Hint | |||
范围:n<=100,p<=5000 |
#include<iostream>
using namespace std;
const int inf=(1<<20);
int main()
{
int a[105][105];
int n,m,p;
while(cin>>n>>m)
{
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) a[i][j]=inf;
for(int i=1;i<=m;i++)
{
int x,y;
cin>>x>>y;
a[x][y]=a[y][x]=1;
}
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(a[i][j]>a[i][k]+a[k][j]) a[i][j]=a[i][k]+a[k][j];
}
}
}
cin>>p;
while(p--)
{
int x,y;
int ans=0;
cin>>x>>y;
for(int k=1;k<=n;k++)
{
if(a[x][k]+a[k][y]==a[x][y]&&k!=x&&k!=y) ans++;
}
cout<<ans+2<<endl;
}
}
return 0;
}