| 述 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;
}
本文介绍了一种算法,用于解决无向图中特定点对间最短路径上的节点总数计算问题。通过Floyd-Warshall算法预处理所有点间的最短路径长度,进而找出任意两点间最短路径覆盖的所有节点。

1376

被折叠的 条评论
为什么被折叠?



