Cod sursa(job #294997)

Utilizator scvalexAlexandru Scvortov scvalex Data 2 aprilie 2009 21:51:30
Problema Algoritmul lui Dijkstra Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <cstdio>
#include <vector>
#include <set>
#include <algorithm>

using namespace std;

#define pb push_back
#define tr(c, i) for (typeof((c).begin()) i = (c).begin(); i != (c).end(); ++i)

typedef pair<int, int> pii;

int N;
vector< vector<pii> > G;
vector<int> D;

void dijkstra(int S, vector<int> &D) {
	D.resize(N+1);
	fill(D.begin(), D.end(), 0);

	set<pii> Q;
	Q.insert(pii(0, S));

	while (!Q.empty()) {
		int u = Q.begin()->second;
		int d = Q.begin()->first;
		Q.erase(Q.begin());

		if (d <= D[u]) {
			tr(G[u], vv) {
				int v = vv->first;
				if ((!D[v]) || (D[u] + vv->second < D[v])) {
					if (D[v])
						Q.erase(pii(D[v], v));
					D[v] = D[u] + vv->second;
					Q.insert(pii(D[v], v));
				}
			}
		}
	}
}

int main(int argc, char *argv[]) {
	int M, u, v, w;

	FILE *fi = fopen("dijkstra.in", "r");
	fscanf(fi, "%d %d", &N, &M);
	G.resize(N+1);
	while (M--) {
		fscanf(fi, "%d %d %d", &u, &v, &w);
		G[u].pb(pii(v, w));
	}
	fclose(fi);

	dijkstra(1, D);

	FILE *fo = fopen("dijkstra.out", "w");
	for (vector<int>::const_iterator ii = D.begin()+2; ii != D.end(); ++ii)
		fprintf(fo, "%d ", *ii);
	fprintf(fo, "\n");
	fclose(fo);

	return 0;
}