Mai intai trebuie sa te autentifici.

Cod sursa(job #662648)

Utilizator andumMorie Daniel Alexandru andum Data 16 ianuarie 2012 21:17:44
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <cstdio>
#include <set>
#include <vector>

using namespace std;

const int MAXN=50100;
const int INF=1000000000;

int N,M,d[MAXN],i,j,k,val,x,a,b,c,pozitie=10004;
vector <int> G[MAXN],C[MAXN];
set < pair<int, int> > T;
char buff[10005];

void citire(int &nr){
    nr=0;
    while(buff[pozitie]<'0' || buff[pozitie]>'9')
        if (++pozitie==10005){
            fread (buff,1,10005,stdin);
            pozitie=0;
        }
    while('0'<=buff[pozitie] && buff[pozitie]<='9'){
        nr=nr*10+buff[pozitie]-'0';
        if (++pozitie==10005){
            fread (buff,1,10005,stdin);
            pozitie=0;
        }
     }
}

int main()
{
    freopen("dijkstra.in", "rt", stdin);
    freopen("dijkstra.out", "wt", stdout);

    citire(N);
    citire(M);

    for (i=1;i<=M;i++)
    {
        citire(a);
        citire(b);
        citire(c);
        G[a].push_back(b);
        C[a].push_back(c);
    }

    for (i=2;i<=N;i++)
        d[i]=INF;

    T.insert(make_pair(0, 1));

    while (T.size()>0)
    {
        val=(*T.begin()).first;
        x=(*T.begin()).second;
        T.erase(*T.begin());
        for(i=0;i<G[x].size();i++)
            if (d[G[x][i]]>val+C[x][i])
            {
                d[G[x][i]]=val+C[x][i];
                T.insert(make_pair(d[G[x][i]],G[x][i]));
            }
    }

    for (i=2;i<=N;i++)
        printf("%d ", d[i]==INF ? 0 : d[i]);

    return 0;
}