Cod sursa(job #394806)

Utilizator zalmanDanci Emanuel Sebastian zalman Data 11 februarie 2010 16:59:11
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <iostream>
#include <ctime>
#include <vector>
#include <queue>
using namespace std;

int N, M, i, x, y, z;

struct asd
{
	int cost, nod;
	bool operator < (const asd& var) const
	{
		return cost > var.cost;
	}
}w, ob;

vector<asd> v [ 50010 ];
priority_queue<asd> pq;
int cd[50010];

void read(void)
{
	FILE *f = fopen("dijkstra.in", "r");
	fscanf(f, "%d%d", &N, &M);
	for(i = 1; i <= M; ++i)
	{
		fscanf(f, "%d%d%d", &x, &y, &z);
		ob.nod = y;
		ob.cost = z;
		v[x].push_back(ob);
	}
	fclose(f);
}

void dijkstra(void)
{
	memset(cd, -1, sizeof(cd));
	w.cost = 0;
	w.nod = 1;
	pq.push(w);
	for(i = 1; i <= N;)
	//while(!pq.empty())
	{
		asd el = pq.top();
		pq.pop();
		int sz = pq.size();
		if(cd[el.nod] == -1)
		{
			++i;
			cd[el.nod] = el.cost;
			for(int j = 0; j < v[el.nod].size(); ++j)
			{
				int nod = el.nod, adiacNod = v[nod][j].nod;
				int cost = el.cost, adiacCost = v[nod][j].cost + cost;
				if(cd[adiacNod] == -1)
				{
					w.cost = adiacCost;
					w.nod = adiacNod;
					pq.push(w);
				}
			}
		}
	}
}
void print(void)
{
	FILE *g = fopen("dijkstra.out", "w");
	for(i = 2; i <= N; ++i)
	{
		if(cd[i] == -1)
			cd[i] = 0;
		fprintf(g, "%d ", cd[i]);
	}	
	fprintf(g, "\n");
	fclose(g);
}

int main(void)
{
	read();
	dijkstra();
	print();
	
	return 0;
}