Cod sursa(job #1087398)

Utilizator acomAndrei Comaneci acom Data 19 ianuarie 2014 13:07:43
Problema Algoritmul lui Dijkstra Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include<cstdio>
#include<vector>
#include<set>
#include<climits>
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]=INT_MAX;
    S.insert(make_pair(0,1));
    for (i=2;i<=n;++i)
        D[i]=INT_MAX, S.insert(make_pair(INT_MAX,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]!=INT_MAX) printf("%d ",D[i]);
        else printf("0 ");
    printf("\n");
    return 0;
}