Cod sursa(job #145691)

Utilizator andrei.12Andrei Parvu andrei.12 Data 29 februarie 2008 10:35:32
Problema Algoritmul lui Dijkstra Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include<stdio.h>
#include<vector>
#include<queue>

using namespace std;

#define pb push_back
#define lg 50005
#define infinit 0x3f3f3f3f

int n, m, x, y, cst, i, nr[lg], val, nod, j, cnt[lg], pz, nxt, st, end;
bool fst[lg];

typedef pair<int, int> graf;
vector<graf> v[lg];
queue<int> q;

int main()
{
	freopen("dijkstra.in", "rt", stdin);
	freopen("dijkstra.out", "wt", stdout);
	
	scanf("%d%d", &n, &m);
	for (i = 1; i <= m; i ++){
		scanf("%d%d%d", &x, &y, &cst);
		
		nr[x] ++;
		v[x].pb(graf(y, cst));
	}
	
	//for (i = 2; i <= n; i ++)
		//cnt[i] = infinit;
	memset(cnt, 0x3f, sizeof(cnt));
	cnt[1] = 0;
	
	q.push(1);
	fst[1] = true;
	st = 1, end = 1;
	
	while (!q.empty()){
		nod = q.front();
		q.pop();
		
		for (i = 0; i < nr[nod]; i ++){
			nxt = v[nod][i].first;
			cst = v[nod][i].second;
			
			if (cst + cnt[nod] < cnt[nxt]){
				cnt[nxt] = cst + cnt[nod];
				
				if (!fst[nxt]){
					q.push(nxt);
					fst[nxt] = true;
				}
			}
		}
		
		fst[nod] = false;
	}
	
	
	for (i = 2; i <= n; i ++){
		if (cnt[i] == infinit || cnt[i] == infinit+2)
			cnt[i] = 0;
		printf("%d ", cnt[i]);
	}
	printf("\n");
	
	
	return 0;
}