Floydアルゴリズム印刷パステンプレート

4700 ワード

#include <iostream>

#include <cstdlib>

#include <cstdio>

#include <algorithm>

#include <vector>

#include <queue>

#include <cmath>

#include <cstring>

using namespace std;

#define INF 0xfffffff

#define maxn 40



int G[maxn][maxn], Path[maxn][maxn], n;



void Floyd()

{

    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];

                    Path[i][j] = Path[i][k];

                }

            }

        }

    }

}

void PutPath(int Star,int End)

{

    while(Star != End)

    {

        printf("%d---->", Star);

        Star = Path[Star][End];

    }

    printf("%d
", End); } void Init() { for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) { Path[i][j] = j; } } } int main() { cin >> n; Init(); for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) { cin >> G[i][j]; if(G[i][j] == -1) G[i][j] = INF; } } Floyd(); PutPath(1,n); printf("%d
", G[1][n]); return 0; } /* 4 -1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 */