Cod sursa(job #704833)

Utilizator dacyanMujdar Dacian dacyan Data 2 martie 2012 20:58:14
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <cstdio>
#include <vector>
#include <set>
#define INF 0x3f3f3f3f
using namespace std;

int n, m;
vector<pair<int, int> > G[50001];
vector<int> d;

void Dijkstra();

int main()
{
    freopen("dijkstra.in", "r", stdin);
    scanf("%d %d", &n, &m);
    int x, y, cost;
    for (int i = 1; i <= m; ++i)
    {
        scanf("%d %d %d", &x, &y, &cost);
        G[x].push_back(make_pair(y, cost));
        G[y].push_back(make_pair(x, cost));
    }
    fclose(stdin);
    
    Dijkstra();
    
    freopen("dijkstra.out", "w", stdout);
    for (int i = 2; i <= n; ++i)    
        if (d[i] != INF) printf("%d ", d[i]);
        else printf("0 ");
    printf("\n");
    fclose(stdout);
    return 0;
}

void Dijkstra()
{
    set<pair<int, int> > S;
    vector<bool> s(n + 1, 0);
    d.resize(n+1, INF);

    d[1] = 0;
    S.insert(make_pair(0, 1));
    while (!S.empty())
    {
        set<pair<int, int> >::iterator it = S.begin();
        S.erase(it);
        int nod = it->second;
        int val = it->first;
        for (int i = 0; i < G[nod].size(); ++i)
        {
            int son = G[nod][i].first;
            int muchie = G[nod][i].second;
            if (d[son] > muchie + val)
            {
                d[son] = muchie + val;
                S.insert(make_pair(d[son], son));
            }
        }
    }
}