Floyd算法模板

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;

#define INF 1e9

const int maxn=100+10;
int n,m;//点数,边数,点从0到n-1编号
int dist[maxn][maxn];//记录距离矩阵
int path[maxn][maxn];//path[i][j]=x表示i到j的路径上(除i外)的第一个点是x.
int A[maxn][maxn];

void init()
{

    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
    {
        A[i][j] = i==j?0:INF;//其实这里d[i][j]应该还要通过输入读数据的
        
    }

    //读取其他dist[i][j]的值
}

void floyd(int dis[][maxn])
{
	for(int i=1;i<=n;i++)
	for(int j=1;j<=n;j++)
	{
		dist[i][j]=A[i][j];
		path[i][j]=j;
	}
    for(int k=1;k<=n;k++)
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
    if(dist[i][k]<INF && dist[k][j]<INF && dist[i][k]>0 &&dist[k][j]>0)
    {
        if(dist[i][j]>dist[i][k]+dist[k][j])
        {
            dist[i][j] = dist[i][k]+dist[k][j];
            path[i][j] = path[i][k];
        }
        else if(dist[i][j] == dist[i][k]+dist[k][j] &&path[i][j]>path[i][k])
        {
            path[i][j] = path[i][k];  //最终path中存的是字典序最小的路径
        }
    }
}

void pfpath(int u, int v) { //打印最短路径
     while(u != v) {
         cout << u  << " ";
        u = path[u][v];
     }
     cout << u << endl;
 }

int main()

{

    //读n和m
	scanf("%d%d",&n,&m);
    init();
	
	for(int i=1;i<=m;i++)
	{
		int x,y,w;
		scanf("%d%d%d",&x,&y,&w);
		A[x][y]=min(A[x][y],w);
		A[y][x]=min(A[y][x],w);
	}

    //读m条边

    floyd(A);
	int u,v;
	while(~scanf("%d%d",&u,&v))
	{
		//输出所求最短路径距离
		pfpath(u,v);
	}
    return 0;

}

猜你喜欢

转载自blog.csdn.net/qq_37025443/article/details/81407338