Cod sursa(job #759818)

Utilizator matei_cChristescu Matei matei_c Data 19 iunie 2012 15:42:48
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;

#define maxn 100001
#define INF 1000

vector <int> vecini[maxn] ;
vector <int> cost[maxn] ;
int n,m ;
int sel[maxn] ;
int d[maxn] ;
int nr ;

void rezolvare(int nod)
{
	
	if( nr == n )
		return ;
	
	sel[nod] = 1 ;
	++ nr ;
	
	for(size_t i=0;i<vecini[nod].size();++i)
	{
		int nod_act = vecini[nod][i] ;
		d[nod_act] = min ( d[nod_act] , d[nod] + cost[nod][i] ) ;
	}
	
	int min = INF ;
	int ind_nod ;
	for(int i=1;i<=n;++i)
	{
		if( d[i] < min && sel[i] == 0 )
		{
			min = d[i] ;
			ind_nod = i ;			
		}	
	}
	
	rezolvare ( ind_nod ) ;
	
}

int main()
{
	
	freopen("dijkstra.in","r",stdin);
	freopen("dijkstra.out","w",stdout);
	
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;++i)
	{
		int a,b,c ;
		scanf("%d%d%d",&a,&b,&c);
		vecini[a].push_back(b) ;
		cost[a].push_back(c) ;
	}	
	
	for(int i=2;i<=n;++i)
		d[i] = INF ;
	
	rezolvare(1) ;
	
	for(int i=2;i<n;++i)
		printf("%d ",d[i]);
	printf("%d\n",d[n]);
	
	return 0;
	
}