【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;
}

【题目积累】

posted @ 2025-01-10 13:11  White_ink  阅读(9)  评论(0)    收藏  举报