采用Floyd算法(插点)

  • 首先输入,将各个站点的距离用邻接矩阵G[][]储存。这里需要注意的是(坑点),题目可能会多次输入两个站点之间的距离,这个距离我们需要取它们之中的最小值(所以将G[][]初始为无穷大)
  • 接着进行初始化,将站点间自己到自己的路径长度设为0
  • 插点,将每两个站点间路径,和将其他站点插入两站点之间的路径进行比较,如果插入后的路径更短,则更新两站点间的最短路径
  • 输出G[s][t]即可,无法到达则输出-1
#include <bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=1e3+5;

int n,m,s,t,a,b,v,G[maxn][maxn];
void Floyd()
{
	//初始化
	for(int i=1;i<=n;i++){//自己到自己
		G[i][i]=0;
	} 
	//插点
	for(int k=1;k<=n;k++){
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				if(G[i][j]>G[i][k]+G[k][j]){//与插入后进行比较
					G[i][j]=G[i][k]+G[k][j];
				}
			}
		}
	} 
}

int main()
{
	//输入 
	cin>>n>>m>>s>>t;
	memset(G,inf,sizeof(G));
	while(m--){
		cin>>a>>b>>v;
		G[a][b]=min(G[a][b],v);
		G[b][a]=G[a][b];
	}
	Floyd();
    //输出
    if(G[s][t]==inf)//无法到达
        cout<<"-1"<<endl;
    else//可以到达
	   cout<<G[s][t]<<endl;
    return 0;
}