Cod sursa(job #2286167)

Utilizator andreiomd1Onut Andrei andreiomd1 Data 19 noiembrie 2018 21:23:38
Problema Floyd-Warshall/Roy-Floyd Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.75 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("royfloyd.in");
ofstream g("royfloyd.out");

const int NMAX=1e2+5;

vector < pair <int, int> > G[NMAX];

priority_queue < pair <int, int>, vector < pair <int, int> >, greater < pair <int, int> > > H;

int N, i, j, C;

int Sol[NMAX];
bool Sel[NMAX];

void Dijkstra (int S)
{
    Sol[S]=0;
    Sel[S]=true;

    for(int i=0; i<G[S].size(); ++i)
    {
        Sol[G[S][i].first]=G[S][i].second;

        H.push({G[S][i].second, G[S][i].first});
    }

    int cnt=G[S].size();

    while(cnt)
    {
        while(Sel[H.top().second]==true)
            H.pop();

        int nod=H.top().second;

        Sel[nod]=true;
        H.pop();
        cnt--;

        for(int i=0; i<G[nod].size(); ++i)
        {
            int j=G[nod][i].first;

            if(Sol[j]==INT_MIN)
            {
                Sol[j]=Sol[nod]+G[nod][i].second;
                H.push({Sol[j], j});

                cnt++;
            }
            else if(Sol[nod] + G[nod][i].second < Sol[j])
            {
                Sol[j]=Sol[nod]+G[nod][i].second;
                H.push({Sol[j], j});
            }
        }
    }

    for(int i=1; i<=N; ++i)
    {
        if(Sol[i]==INT_MIN)
            g<<0<<' ';
        else
            g<<Sol[i]<<' ';

        Sol[i]=INT_MIN;

        Sel[i]=false;
    }

    g<<'\n';

    while(!H.empty())
        H.pop();
}

int main()
{
    f.tie(NULL);

    f>>N;

    for(i=1; i<=N; ++i)
    {
        for(j=1; j<=N; ++j)
        {
            f>>C;

            if(C)
                G[i].push_back({j, C});
        }

        Sol[i]=INT_MIN;
    }

    for(int i=1; i<=N; ++i)
        Dijkstra(i);

    return 0;
}