Cod sursa(job #1088836)

Utilizator acomAndrei Comaneci acom Data 20 ianuarie 2014 21:16:40
Problema Algoritmul lui Dijkstra Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include<cstdio>
#include<vector>
#include<set>
using namespace std;
vector < pair <int,int> > v[50005];
set < pair <int,int> > S;
set < pair <int,int> >::iterator it;
int n,m,s,x,y,c,D[50005];
int main()
{
    int i;
    freopen("dijkstra.in","r",stdin);
    freopen("dijkstra.out","w",stdout);
    scanf("%d%d",&n,&m);
    D[0]=1<<30;
    S.insert(make_pair(0,1));
    for (i=2;i<=n;++i)
        D[i]=1<<30, S.insert(make_pair(D[i],i));
    for (i=0;i<m;++i)
    {
        scanf("%d%d%d",&x,&y,&c);
        v[x].push_back(make_pair(c,y));
    }
    while (!S.empty())
    {
        it=S.begin();
        s=it->second;
        D[s]=it->first;
        S.erase(it);
        for (i=0;i<v[s].size();++i)
        {
            it=S.find( make_pair(D[v[s][i].second],v[s][i].second) );
            if (it!=S.end())
            {
                c=it->first, x=it->second;
                c=min(c,D[s]+v[s][i].first);
                S.erase(it);
                S.insert(make_pair(c,x));
                D[x]=c;
            }
        }
    }
    for (i=2;i<=n;++i)
        if (D[i]!=1<<30) printf("%d ",D[i]);
        else printf("0 ");
    printf("\n");
    return 0;
}