Cod sursa(job #833306)

Utilizator mathboyDragos-Alin Rotaru mathboy Data 12 decembrie 2012 11:24:52
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.81 kb
#include <cstdio>
#include <vector>

#define f first
#define s second
#define fs (mid << 1)
#define fd ((mid << 1) + 1)
#define mp make_pair
const int MAXARBINT = 1 << 17;
const int maxn = 50010;
const int INF = 0x3f3f3f3f;
using namespace std;

vector <pair <int, int> > graph[maxn];
int n, d[maxn];

pair <int, int> aint[MAXARBINT];
 
void build_tree(int node, int lf, int rt) {
	if(lf == rt) {
		aint[node] = mp(INF, lf);
		return ;
	}
	int mid = (lf + rt) >> 1;
	build_tree(fs, lf, mid);
	build_tree(fd, mid + 1, rt);
	
	aint[node] = min(aint[fs], aint[fd]);
}
void update(int node, int lf , int rt, int pos, int val) {
	if(lf == rt) { 
		aint[node] = mp(val, pos);
		return ;
	}
	int mid = (lf + rt) >> 1;
	if(pos <= mid) update(fs, lf, mid, pos, val);
	if(pos > mid) update( fd, mid + 1, rt, pos, val);
	
	aint[node] = min(aint[fs], aint[fd]);
}

void dijkstra(int node) {

	for(int i = 1; i <= n; ++i)
		d[i] = INF;

	d[node] = 0;

	build_tree(1, 1, n);
	update(1, 1, n, node, 0);
	
	for(int i = 1; i <= n; ++i) {
		node = aint[1].s;
		update(1, 1, n, node, INF);
		//printf("%d\n", node);
		for(vector <pair <int, int> > :: iterator it = graph[node].begin(); it != graph[node].end(); ++it) 
			if(d[it -> f] > d[node] + it -> s) {
				d[it -> f] = d[node] + it -> s;
				update(1, 1, n, it -> f, d[it -> f]);
			}
		
	}
	for(int i = 2; i <= n; ++i) {
			if(d[i] == INF) printf("0 ");
			else printf("%d ", d[i]);
	}
	printf("\n");
}
int main() {
	freopen("dijkstra.in", "r", stdin);
	freopen("dijkstra.out", "w", stdout);
	
	int m, x, y, c;
	for( scanf("%d %d\n", &n, &m); m--; ) {
		scanf("%d %d %d", &x, &y, &c);
		graph[x].push_back(make_pair(y, c));
	}
	
	for(int i = 1; i <= n; ++i)
		graph[i].resize(graph[i].size() + 1);
	dijkstra(1);
	
	return 0;
}