Cod sursa(job #1592821)

Utilizator ClaudiuHHiticas Claudiu ClaudiuH Data 7 februarie 2016 23:11:58
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
//Dijkstra
//#include<iostream>
#include<fstream>
#define NMAX 50000
using namespace std;

ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");

const float PInfinit=1.e20;
float a[50000][5000], d[NMAX+5], minim;
int n,m,s[NMAX+5],t[NMAX+5],poz;
// D=vectorul lungimii drumurilor de la varful 1 la toate celelalte varfuri
// T=indica drumurile gasite intre nodul 1 si celelalte, T[r]=0
// S=vectorul nodurilor selectate (1 sau 0)

void citire()
{
	int i,j;
	float c; // c = cost pondere
	fin>>n>>m;
	
	for(int i=1;i<=n;++i)
		for(int j=1;j<=n;++j)
			if(i!=j)
				a[i][j] = PInfinit;
				
	for(int p=1;p<=m;++p)
	{
		fin>>i>>j>>c;
		a[i][j] = c;
	}
	
}

/*
void afisare_mat_pond()
{
	for(int i=1;i<=n;++i)
	{
		for(int j=1;j<=n;++j)
		cout<<a[i][j]<<" ";
		cout<<endl;
	}
}

*/
int main()
{
	citire();
	//afisare_mat_pond();
	s[1] = 1;	///marcam nodul 1 ca vizitat
	for(int i=1;i<=n;++i)
	{
		d[i] = a[1][i];
		if(i!=1)
			if(d[i] < PInfinit)
				t[i] = 1;
	}
	
	for(int i=1;i<n;++i)
	{
		minim = PInfinit;
		for(int j=1;j<=n;++j)
			if(s[j] == 0)	//Daca nu e selectat/vizitat
				if(d[j] < minim)
				{
					minim = d[j];
					poz = j;
				}
		s[poz] = 1;
		
		for(int j=1;j<=n;++j)
			if(s[j] == 0)
				if(d[j] > d[poz] + a[poz][j])	//caut nodul final
				{
					d[j] = d[poz] + a[poz][j];
					t[j] = poz;
				}
	}
	
	for(int i=2;i<=n;++i)
		if(t[i] != 0)
			fout<<d[i]<<" ";
			
	return 0;
}