Cod sursa(job #3139662)

Utilizator PostoacaMateiMatei Postoaca PostoacaMatei Data 30 iunie 2023 17:16:09
Problema Floyd-Warshall/Roy-Floyd Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

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

int n, dist[100001], inqueue[100001];
vector<pair<int, int>> gf[100001];
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
const int INF = 2e9;

void dijkstra(int start) {
    dist[start] = 0;
    pq.push({ dist[start], start });
    inqueue[start] = 1;
    while (!pq.empty()) {
        int cost = pq.top().first;
        int nod = pq.top().second;
        pq.pop();
        inqueue[nod] = 0;
        for (auto vecin : gf[nod]) {
            int costnou = vecin.first;
            int nodnou = vecin.second;
            if (dist[nodnou] > dist[nod] + costnou) {
                dist[nodnou] = dist[nod] + costnou;
                if (!inqueue[nodnou]) {
                    pq.push({ dist[nodnou], nodnou });
                    inqueue[nodnou] = 1;
                }
            }
        }
    }
}

int main()
{
    fin >> n;
    int c;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++) {
            fin >> c;
            gf[i].push_back({ c, j });
        }
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++)
            dist[j] = INF;
        dijkstra(i);
        for (int j = 1; j <= n; j++)
            if (dist[j] == INF)
                fout << "0 ";
            else fout << dist[j] << " ";
        fout << "\n";
    }
    return 0;
}