【Floyd】
【Floyd】
※用于处理多源汇最短路
时间复杂度:\(O(n^3)\)
思路
邻接矩阵存图/区间DP思想
d[i][j]表示从i到j的最短路
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
d[i][j]=min(d[i][j],d[i][k]+d[k][j])
代码
模版题 https://www.acwing.com/problem/content/description/856/
#include<bits/stdc++.h>
using namespace std;
const int N=210,MAXN=1e9;
int n,m,q;
int d[N][N];//邻接矩阵存图
void floyd(){
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
}
}
}
}
int main(){
scanf("%d%d%d",&n,&m,&q);
//邻接矩阵初始化
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i==j) d[i][j]=0;//处理自环->直接省略
else d[i][j]=MAXN;
}
}
while(m--){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
//处理重边:选择最小的边
d[x][y]=min(d[x][y],z);
}
floyd();
while(q--){
int a,b;
scanf("%d%d",&a,&b);
int ans=d[a][b];
if(ans>MAXN/2) printf("impossible\n");//大于一个很大的数即可(负权边)
else printf("%d\n",ans);
}
return 0;
}

浙公网安备 33010602011771号