Cod sursa(job #896976)

Utilizator SPDionisSpinei Dionis SPDionis Data 27 februarie 2013 18:17:05
Problema Floyd-Warshall/Roy-Floyd Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <fstream>
#include <vector>
#include <iostream>

using std::cout;
using std::vector;
const int inf = 1000000;
std::ifstream in("royfloyd.in");
std::ofstream out("royfloyd.out");

struct edge
{
    int s,n,w;
};

int N;
vector<edge> b;
vector< vector<int> > dist;


vector<int> solve(int nod)
{
    vector <int> d;
    d.resize(N+1,inf);
    d[nod] = 0;
    int k = 1;
    while (k)
    {
        k = 0;
        for (int i = 0; i < b.size(); ++i)
        if ( d[ b[i].s ] + b[i].w < d[ b[i].n ] ) {
            d[ b[i].n ] = d[ b[i].s ] + b[i].w;
            ++k;
        }
    }

    for (int i = 1; i < d.size(); ++i)
        if ( d[i] == inf ) d[i] = 0;
    return d;
}

int main()
{
    in >> N;
    for (int i = 1; i <= 5; ++i)
        for (int j = 1; j <= 5; ++j)
    {
        int t1; in >> t1;
        if (t1) {
        edge temp;
        temp.s = i; temp.n = j; temp.w = t1;
        b.push_back(temp);
        }
    }


    for (int i = 1; i <= N; ++i)
        dist.push_back( solve(i) );

    for (int i = 0; i < dist.size(); ++i) {
        if (i) out << '\n';
        for (int j = 1; j < dist[i].size(); ++j)
        out << dist[i][j] << " ";
    }

    in.close();
    out.close();
    return 0;
}