<题目传送门>
就是一道Floyd求两点最短路的模板题...
先说一说Floyd吧:
假设有三个点A,B,C,位置如下:
A->B就可以选择直接走(AB)或间接走(AC->BC)
由此可以得出一个类似DP的方程:dp[A,B]=min(dp[A,C]+dp[B,C],dp[A,B]);
那么在图论中,一个点大多可以看做是直接或间接走到的,那么Floyd其实就构造了很多上面的三角形,中心就在于找到一个像C一样的转运点
Floyd中我们就可以枚举每个点当做C点,求直接走和间接走的距离的最小值
复杂度O(N^3),在数据大一点情况下是不行的,但codevs1077足够了...
代码如下
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN=1000+3;
int dis[MAXN][MAXN];
int m;
void floyd()
{
for(int k=1;k<=m;k++)
for(int i=1;i<=m;i++)
for(int j=1;j<=m;j++)
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
}
int main()
{
memset(dis,0x3f,sizeof(dis));
scanf("%d",&m);
int w;
for(int i=1;i<=m;i++)
for(int j=1;j<=m;j++)
{
scanf("%d",&w);
dis[i][j]=w;
dis[j][i]=w;
}
floyd();
int k,sa,sb;
scanf("%d",&k);
for(int i=0;i<k;i++)
{
scanf("%d%d",&sa,&sb);
printf("%d\n",dis[sa][sb]);
}
return 0;
}
原创作品,转载请标明出处!