Cod sursa(job #3259263)

Utilizator Deleanu_LucaDeleanu Luca Deleanu_Luca Data 25 noiembrie 2024 16:54:16
Problema Algoritmul lui Dijkstra Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.84 kb
#include <fstream>
#include <vector>
#include <queue>
#define NMAX 50005
#define INF 1000000007

using namespace std;

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

struct varf{int x, c;};

int n,m;
int cmin[NMAX],pre[NMAX],M[NMAX];
vector<varf> G[NMAX];

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

void initializare(int start);
void dijkstra(int start);
void afisare();

int main()
{
    int i,x,y,c;
    varf vf;

    fin>>n>>m;

    for(i=1; i<=m; i++)
    {
        fin>>x>>y>>c;
        vf.x=y; vf.c=c;
        G[x].push_back(vf);
    }

    dijkstra(1);

    afisare();

    return 0;
}

void initializare(int start)
{
    int i;
    pair<int,int> p;

    for(i=1; i<=n; i++)
    {cmin[i]=INF; pre[i]=start;}
    pre[start]=cmin[start]=0; M[start]=1;

    for(i=0; i<G[start].size(); i++)
    {
        cmin[G[start][i].x]=G[start][i].c;
        p.first=cmin[G[start][i].x];
        p.second=G[start][i].x;
        H.push(p);
    }
}

void dijkstra(int start)
{
    int i,j,cost,vfmin;
    pair<int,int> p;

    initializare(1);

    for(j=1; j<n && !H.empty();)
    {
        p=H.top(); H.pop();
        cost=p.first;
        vfmin=p.second;
        if(M[vfmin]==0)
        {
            M[vfmin]=1; j++;
            for(i=0; i<G[vfmin].size(); i++)
                if(cmin[G[vfmin][i].x]>G[vfmin][i].c+cost)
                {
                    cmin[G[vfmin][i].x]=G[vfmin][i].c+cost;
                    pre[G[vfmin][i].x]=vfmin;
                    p.first=cmin[G[vfmin][i].x];
                    p.second=G[vfmin][i].x;
                    H.push(p);
                }
        }
    }
}

void afisare()
{
    int i;
    for(i=2; i<=n; i++)
        if(cmin[i]==INF)
            fout<<0;
        else fout<<cmin[i]<<' ';
}