Cod sursa(job #3191267)

Utilizator PetraPetra Hedesiu Petra Data 9 ianuarie 2024 10:26:07
Problema Floyd-Warshall/Roy-Floyd Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include <iostream>
#include <fstream>
#include <cmath>

#define NMAX 258

using namespace std;

ifstream fin ("royfloyd.in");
ofstream fout ("royfloyd.out");

struct nod {
    int nod, d;
};
int n, a[NMAX][NMAX], n_drum[NMAX][NMAX];
long long dp[NMAX][NMAX]; /// dp[i][j] - distanta minima pentru a ajunge din nodul i in nodul j

void citire()
{
    fin >> n;

    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
        {
            fin >> a[i][j];
            dp[i][j] = a[i][j];
            if (i != j) n_drum[i][j] = 1;
        }
}

void afis()
{
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= n; j++)
            fout << dp[i][j] << " ";
        fout << "\n";
    }
}

int main()
{
    citire();

    for (int k = 1; k <= n; k++)
    {
        for (int i = 1; i <= n; i++)
        {
            for (int j = 1; j <= n; j++)
            {
                if (i == k || j == k || i == j) continue;

                if (dp[i][j] > dp[i][k] + dp[k][j])
                {
                    dp[i][j] = dp[i][k] + dp[k][j];
                    n_drum[i][j] =  n_drum[i][k] + n_drum[k][j];
                }
                else if (dp[i][j] == dp[i][k] + dp[k][j] && n_drum[i][j] < n_drum[i][k] + n_drum[k][j])
                    n_drum[i][j] =  n_drum[i][k] + n_drum[k][j];
            }
        }
    }

    afis();

    return 0;
}