Cod sursa(job #2373511)

Utilizator pistvanPeter Istvan pistvan Data 7 martie 2019 13:52:10
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.78 kb
#include <iostream>
#include <fstream>
#include <limits.h>
#include <set>
#include <vector>
#define INF INT_MAX
#define MAXN 50001

using namespace std;

int N, M;
bool vis[MAXN];
int dist[MAXN];
vector<pair<int,int>> G[MAXN];//adjacency list with vertex-weight pairs
//G[a][0].first contains the number of neighbours of a
set<pair<int,int>> S; //a set of distance-node pairs

void Read()
{
    ifstream f("dijkstra.in");
    f>>N>>M;
    for (int i=1;i<=N;i++)
    {
        //G[i].push_back({0, 0});
        dist[i]=(i==1)?0:INF;
        //S.insert({dist[i], i});
    }
    int a, b, c;
    for (int i=1;i<=M;i++)
    {
        f>>a>>b>>c;
        G[a].push_back({b, c});
        //G[a][0].first++;
    }
}

void Dijkstra()
{
    int source, sourcedist, nextnode, nextdist;
    S.insert({0,1});
    while (!S.empty())
    {
        source=S.begin()->second;
        sourcedist=S.begin()->first;
        //cout<<"At "<<source<<'\n';
        S.erase(S.begin());
        for (vector<pair<int,int>>::iterator it=G[source].begin();it!=G[source].end();++it)
        {
            nextnode=it->first;
            nextdist=it->second;
            if (vis[nextnode])
                continue;
            if (dist[nextnode]>nextdist+sourcedist)
            {
                if (dist[nextnode]!=INF)
                    S.erase(S.find({dist[nextnode], nextnode}));
                dist[nextnode]=nextdist+sourcedist;
                S.insert({dist[nextnode], nextnode});
            }
        }
        vis[source]=1;
    }
}

void Write()
{
    ofstream g("dijkstra.out");
    for (int i=2;i<=N;i++)
        if (dist[i]==INF)
            g<<0<<' ';
        else
            g<<dist[i]<<' ';
}

int main()
{
    Read();
    Dijkstra();
    Write();
}