Cod sursa(job #1125114)

Utilizator Becu15Coca Cola Octavian Becu15 Data 26 februarie 2014 15:46:10
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <cstdio>
#include <queue>
#include <vector>
#define INF 1<<30
#define MAXN 50001
#define MAXM 250001
using namespace std;

struct cmp
{
	public:
		bool operator()(const pair<int, int> a, const pair<int, int> b)
		{	
			if (a.second!=b.second) return (a.second<b.second);
			else return (a.first<b.first);
		}
};

priority_queue<pair<int, int>, vector<pair<int, int> >, cmp> q;
vector<pair<int, int> > vec[MAXN];

int viz[MAXN];
int dist[MAXN];
int n,m;

void dijkstra(int startnod);
void init(int start);

int main()
{
	freopen("dijkstra.in","r",stdin);
	freopen("dijkstra.out","w",stdout);
	scanf("%d %d",&n,&m);
	for (int i = 0, a, b, c ; i < m ; ++i) {
		scanf("%d %d %d",&a,&b,&c);
		vec[a].push_back(make_pair(b,c));
	}
	int start = 1;
	init(start);
	dijkstra(start);
	
	for (int i = 2 ; i<=n ; ++i)
		printf("%d ",dist[i]==INF ? 0 : dist[i]);
	return 0;
}
void init(int start)
{
	for (int i = 1 ; i <= n ; ++i)
		dist[i] = INF;
	dist[start]=0;
}
void dijkstra(int startnod)
{
	int tf;
	q.push(make_pair(startnod,0));
	while (!q.empty())
	{
			tf=q.top().first;
			viz[tf]=1;
			q.pop();
			for (unsigned i = 0 ; i < vec[tf].size() ; ++i)
			{
				if (!viz[vec[tf][i].first])
					if (dist[vec[tf][i].first] > dist[tf]+vec[tf][i].second) {
						dist[vec[tf][i].first] = dist[tf]+vec[tf][i].second;
						q.push(make_pair(vec[tf][i].first, dist[vec[tf][i].first]));
					}
			}
	}
}