Cod sursa(job #410169)

Utilizator LinkLazar Claudiu Florin Link Data 4 martie 2010 10:07:15
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <fstream>

using namespace std;
#define inf 999999999;
ifstream in("dijkstra.in");
ofstream out("dijkstra.out");
int n, m, x[50002],v[50002],t[50002];

int g[20002][20002];


void init(int p)
{
	for ( int i =1 ; i<=p;i++)
		for( int j = 1; j <=n;j++)			
		g[i][j] = -1;
}
void citire()
{
		 
	in>>n>>m;
	int x,y,z;
	init(n);
	for(int i = 1; i<=m;i++)	
	{ 
		in>>x>>y>>z;
		g[x][y] = z;		
	}
}

int minim()
{
	int min = inf;
	int mn = 1;
	
	for(int i = 1;i<=n;i++)
	{
		if((v[i]==0) && (x[i] < min) && x[i] != -1) { min = x[i]; mn=i;}
	}
	
	if (mn == 1 ) return 0;
	
	return mn;
}

void complete()
{
	
}

void dijkstra()
{
	int current;
	
 	v[1]=1;
	for( int i = 1; i <= n ; i++ )
	{
		x[i] = g[1][i];
		if ( x[i]>=0 ) t[i] = 1;		
	}
	x[1] = 0;
	
	current = minim();
	while( current )
	{
		
		for ( int i = 1 ; i <= n ; i++ )			
		{
			int j = g[current][i];
			int k = x[current];
			if(j>=0 && k >= 0 && j+k < x[i]) 
			{	
				x[i] = g[current][i]+x[current];
				t[i] = current;
			}
			else if ( j>=0 && x[i] == -1 )
			{
				x[i] = g[current][i]+x[current];
				t[i] = current;
			}
		}
		v[current] = 1;	
			
		current = minim();
	}	
	
}



int main()
{
	citire();
	dijkstra();
	
	for(int i =2; i<n;i++)
		out<<x[i]<<" ";
	
	out<<x[n];
	
	in.close();
	out.close();
	return 0;
}