Cod sursa(job #766521)

Utilizator iris88Nagy Aliz iris88 Data 11 iulie 2012 15:30:31
Problema Algoritmul lui Dijkstra Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.42 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <queue>
#include <limits.h>
#include <set>
//#include <algorithm>
using namespace std;
vector<bool> visited;
vector<vector<int> > adj;
vector<vector<int> > cost;
vector<int> path;
vector<int > Q;
vector<int> heapIndex;
int count;
void push(int k,int index)
{	
	int p = (index-1)/2;
	while (index>0 && path[Q[p]]>path[Q[index]])
	{
	  int swapp = Q[index];
	  Q[index] = Q[p];
	  Q[p]=swapp;
	  heapIndex[Q[index]] = index;	  
	  index = (index-1)/2;	 
	  p = (index-1)/2;
	}
	heapIndex[Q[index]] = index;
}
int pop()
{
	int p = Q.front();
	Q[0]=Q[Q.size()-1];
	heapIndex[Q[0]]=0;
	Q.pop_back();
	int index = 0;
	int minindex;
	bool swap;
	do{
		swap =false;
		minindex = index;
		int left = 2*index+1;
		int right = 2*index+2;
		if (left<Q.size() && path[Q[left]]<path[Q[index]])
			minindex = left;
		if (right<Q.size() &&path[Q[right]]<path[Q[minindex]])
			minindex = right;
		if (minindex!=index)
		{
			int swapp = Q[minindex];
			Q[minindex] = Q[index];
			Q[index] = swapp;
			heapIndex[Q[index]] = index;	
				heapIndex[Q[minindex]] = index;
			swap = true;
		}
		index = minindex;
	}while (swap);

	return p;
}
void dijkstra(int n)
{
	while (!Q.empty()){
		int cst,k;
		int fe= pop();
		cst = path[fe];
		k = fe;	
		visited[k]=true;
		path[k] = cst;
		for (int i=0;i<adj[k].size();i++)
		{
			if (!visited[adj[k][i]])
				{
					int s=cost[k][i]+cst;
					if (path[adj[k][i]]==INT_MAX){
						int t= adj[k][i];
						path[adj[k][i]] = s;
						Q.push_back(t);
						int index = Q.size()-1;
						push(adj[k][i],index);
					}
					else if (path[adj[k][i]]>s)
					{
						int index = heapIndex[adj[k][i]];
						path[adj[k][i]] = s;
						push(adj[k][i],index);
					}
				}			
		}
	}
}
int main()
{
	FILE *f = fopen("dijkstra.in","r");
	FILE *g = fopen("dijkstra.out","w+");
	int n,m;
	fscanf(f,"%d %d",&n,&m);
	adj.resize(n+1);
	visited.resize(n+1);
	path.resize(n+1);
	cost.resize(n+1);
	heapIndex.resize(n+1);
	for (int i=0;i<=n;i++){
		visited[i]= false;
		path[i] = INT_MAX;
	}
	for (int i=0;i<m;i++)
	{
		int a,b,c;
		fscanf(f,"%d %d %d", &a,&b,&c);
		adj[a].push_back(b);		
		cost[a].push_back(c);
	}
	Q.push_back(1);	
	path[1]=0;
	dijkstra(n);
	for (int i=2;i<=n;i++)
		if (path[i]==INT_MAX)
			fprintf(g,"0 ");
		else
			fprintf(g,"%d ",path[i]);
	fclose(f);
	fclose(g);
}