Cod sursa(job #175480)

Utilizator ScrazyRobert Szasz Scrazy Data 9 aprilie 2008 23:18:23
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <iterator>
using namespace std;

#define inf 0x3f3f3f
const int MAX_N = 50001;
struct nod { int x, c;nod(){}; nod(int a, int b){x=a;c=b;};};

vector<nod> G[MAX_N];
int d[MAX_N];

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

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

int n, m;

void dijkstra()
{
    vector<nod>::iterator it;
    bool inq[MAX_N];
    int k;
    memset(inq,0,sizeof(inq));
    memset(d,inf,sizeof(d));
    d[1] = 0; Q.push(1); inq[1] = 1;
    while (!Q.empty())
    {
	k = Q.top(); Q.pop(); inq[k] = 0;
	for (it = G[k].begin(); it != G[k].end(); ++it)
	    if (d[it->x] > d[k] + it->c)
	    {
		d[it->x] = d[k] + it->c;
		if (!inq[it->x])
		{
		    Q.push(it->x);
		    inq[it->x] = 1;
		}
	    }
    }
}

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

    dijkstra();
    for (int i = 1; i <= n; ++i) if (d[i] == inf) d[i] = 0;
    freopen("dijktra.out","w",stdout);
    for (int i = 2; i <= n; ++i) printf("%d ", d[i]);

    return 0;
}