Cod sursa(job #175440)

Utilizator ScrazyRobert Szasz Scrazy Data 9 aprilie 2008 22:37:32
Problema Algoritmul lui Dijkstra Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;

#define inf 0x3f3f3f
const int MAX_N = 50001;

vector<int> G[MAX_N], C[MAX_N];
vector<int> d;

struct Comp
{
    bool operator ()(int i, int j)
    {
	return d[i] < d[j];
    }
};

priority_queue<int, vector<int>, Comp> Q;

int n, m;

void dijkstra()
{
    int i, k;
    for (i = 1; i <= n; ++i) d[i] = inf;
    d[1] = 0; Q.push(1);
    while (!Q.empty())
    {
	k = Q.top(); Q.pop();
	for (i = 0; i < (int)G[k].size(); ++i)
	    if (d[G[k][i]] > d[k] + C[k][i])
	    {
		d[G[k][i]] = d[k] + C[k][i];
		Q.push(G[k][i]);
	    }
    }
}

int main()
{
    freopen("dijkstra.in","r",stdin);
    freopen("dijkstra.out","w",stdout);
    scanf("%d%d", &n, &m); 
    d.resize(n + 1);
    for (int i = 1; i <= m; ++i)
    {
	int x, y, c; scanf("%d%d%d", &x, &y, &c); 
	G[x].push_back(y);
	C[x].push_back(c);
    } 

    dijkstra();
    for (int i = 2; i <= n; ++i) 
	printf("%d ", d[i] == inf ? 0 : d[i]);

    return 0;
}