Cod sursa(job #1264646)

Utilizator catalincraciunCraciun Catalin catalincraciun Data 15 noiembrie 2014 23:41:16
Problema Algoritmul lui Dijkstra Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
// Craciun Catalin
//  Infoarena
//   Dijkstra

#include <iostream>
#include <fstream>
#include <map>
#include <algorithm>
#include <bitset>
#include <string>
#include <cstring>
#include <cassert>
#include <cstdlib>

using namespace std;

#define inf 1<<30
#define NMax 200005
//#define DBG 1

struct graf {

	int cost;
	int nod;
	graf *next;
	graf() {
		cost = inf;
		next = NULL;
	}
};

ifstream f("dijkstra.in");
ofstream g("dijkstra.out");

int n, m;
graf *a[NMax];
int d[NMax];
bool visited[NMax];

void afisare() {
	
	for (int i=2;i<=n;i++) {
		if (d[i] == inf)
			g<<0<<' ';
		else
			g<<d[i]<<' ';
	}
	g<<'\n';
}

void add(int where, int what, int cost) {
	
	graf *aux = new graf;
	aux -> nod = what;
	aux -> cost = cost;
	aux -> next = a[where];
	a[where] = aux;
}

void dijkstra() {
	
	for (int i=1;i<=n;i++)
		d[i] = inf;
	
	
	d[1] = 0;
	int minim;
	int pminim;
	for (int i=1;i<=n;i++) {
		pminim = 0; minim = inf;
		for (int i=1;i<=n;i++) {
			if (!visited[i] && minim > d[i]) {
				minim = d[i];
				pminim = i;
			}
		}
		
		visited[pminim] = 1;
		graf *q = a[pminim];
		while (q) {
			if (d[q->nod] > d[pminim] + q->cost)
				d[q->nod] = d[pminim] + q->cost;
			q=q->next;
		}
	}
}

void read() {
	
	f>>n>>m;
	for (int i=1;i<=m;i++) {
		int a,b,c; f>>a>>b>>c;
		add(a,b,c);
	}
}

int main() {

	read();
	dijkstra();
	afisare();

	f.close(); g.close();

	return 0;
}