Cod sursa(job #856518)

Utilizator gabriel93Robu Gabriel gabriel93 Data 16 ianuarie 2013 17:01:44
Problema Algoritmul lui Dijkstra Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include<stdio.h>
#include<set>
#include<vector>
#define Nmax 50002
using namespace std;

int n,m;
vector< pair<int,int> > g[Nmax];
multiset< pair< int,pair<int,int> > > h;
int viz[Nmax];
int d[Nmax];

void citire()
{
    int i,x,y,c;
    scanf("%d %d",&n,&m);
    for(i=1;i<=m;++i)
    {
        scanf("%d %d %d",&x,&y,&c);
        g[x].push_back(make_pair(y,c));
    }
}

void rezolv()
{
    vector< pair<int,int> >::iterator it;
    multiset< pair< int,pair<int,int> > >::iterator ith;
    int i,x,y,c;
    for(it=g[1].begin();it<g[1].end();++it)
    {
        h.insert(make_pair(it->second,make_pair(1,it->first)));
    }
    viz[1]=1;
    d[1]=0;
    for(i=1;i<n;++i)
    {
        ith=h.begin();
        y=ith->second.second;
        if(viz[y]==0)
        {
            x=ith->second.first;
            c=ith->first;
            viz[y]=1;
            d[y]=d[x]+c;
            for(it=g[y].begin();it<g[y].end();++it)
                //if(viz[it->first]==0)
                    h.insert(make_pair(it->second,make_pair(y,it->first)));
        }
        h.erase(*h.begin());
    }
}

void scrie()
{
    int i;
    for(i=2;i<=n;++i)
        printf("%d ",d[i]);
}

int main()
{
    freopen("dijkstra.in","r",stdin);
    freopen("dijkstra.out","w",stdout);
    citire();
    rezolv();
    scrie();
    fclose(stdin);
    fclose(stdout);
    return 0;
}