Floyd最短路(含路径回溯)

/*
Floyd-Warshall最短路
D记录图
P复原路径(P[i][j]表示i到j最路径上j的前驱点,也是DP打表实现)
,每更新一次D就更新一次P
*/
#include
using namespace std;
#define INF 0x3f3f3f3f
#define Max_N 1005
int D[Max_N][Max_N];
int P[Max_N][Max_N];
int N,M;  //顶点数边数
int S,E;  //起点终点
void Floyd()
{
    for(int k=1;k<=N;k++)
        for(int i=1;i<=N;i++)
            for(int j=1;j<=N;j++)
            {
                if(D[i][j]>D[i][k]+D[k][j])
                {
                    D[i][j]=D[i][k]+D[k][j];
                    P[i][j]=P[k][j];
                }
            }
}
int main()
{
    //init
    memset(D,0x3f,sizeof(D));
    memset(P,0x3f,sizeof(P));
    //录入图
    cin>>N>>M;
    for(int i=1;i<=M;i++)
    {
        int u,v,cost;
        cin>>u>>v>>cost;
        if(cost>S>>E;
    //
    Floyd();
    //最短距离
    cout<

 

你可能感兴趣的:(模板)