Cod sursa(job #175469)

Utilizator ScrazyRobert Szasz Scrazy Data 9 aprilie 2008 22:59:32
Problema Algoritmul lui Dijkstra Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 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, inq;

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;
    d[1] = 0; Q.push(1); inq[1] = 1;
    while (!Q.empty())
    {
	k = Q.top(); Q.pop(); inq[k] = 0;
	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];
		if (!inq[G[k][i]])
		{
		    Q.push(G[k][i]);
		    inq[G[k][i]] = 1;
		}
	    }
    }
}

int main()
{
    freopen("dijkstra.in","r",stdin);
    freopen("dijkstra.out","w",stdout);
    scanf("%d%d", &n, &m); 
    d.resize(n + 1); inq.resize(n + 1); 
    inq.assign(n + 1, 0);d.assign(n + 1, inf);
    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;
}