Cod sursa(job #1369221)

Utilizator retrogradLucian Bicsi retrograd Data 2 martie 2015 22:42:32
Problema Floyd-Warshall/Roy-Floyd Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include<fstream>
#include<vector>
#include<queue>

using namespace std;
typedef int var;

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

#define MAXN 101
#define INF (1<<28)
#define mp make_pair

typedef pair<var, var> pii;

struct Edge {
    var n, c;
    Edge(var a, var b) {
    n = a; c = b;}
};
vector<Edge> G[MAXN];
var DIST[MAXN];
bool VIZ[MAXN];
var n;

struct cmp{
    const bool operator()(const pii &a, const pii &b) const{
    return a.second > b.second;
    }
};

priority_queue<pii, vector<pii>, cmp> Q;

void dijkstra(var start) {
    for(var i=1; i<=n; i++) {
        DIST[i] = INF;
        VIZ[i] = 0;
    }
    DIST[start] = 0;
    Q.push(mp(start, 0));
    while(!Q.empty()) {
        var node = Q.top().first;
        Q.pop();

        if(VIZ[node]) continue;
        else VIZ[node] = 1;

        for(auto e : G[node]) {
            if(DIST[e.n] > DIST[node] + e.c) {
                DIST[e.n] = DIST[node] + e.c;
                Q.push(mp(e.n, DIST[e.n]));
            }
        }
    }
}


int main() {
    fin>>n;
    var x;
    for(var i=1; i<=n; i++) {
        for(var j=1; j<=n; j++) {
            fin>>x;
            if(x) {
                G[i].push_back(Edge(j, x));
            }
        }
    }
    for(var i=1; i<=n; i++) {
        dijkstra(i);
        for(var j=1; j<=n; j++) {
            if(DIST[j] < INF) {
                fout<<DIST[j]<<" ";
            } else {
                fout<<"0 ";
            }
        }
        fout<<'\n';
    }
    return 0;
}