Cod sursa(job #585244)

Utilizator suzanicaSuzanica Mihu suzanica Data 28 aprilie 2011 18:12:30
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include<fstream>
#define maxvf 50001
#define inf 10000
using namespace std;
ifstream f("dijkstra.in");
ofstream g("dijkstra.out");
int n;
double C[1000][1000],d[maxvf];
int pre[maxvf],M[maxvf];
void initializare()
{
	int i,j,m,x,y;
	double c;
	f>>n>>m;
	for(i=1;i<=n;i++)
		for(j=i+1;j<=n;j++)
			C[j][i]=C[i][j]=inf;
		while(f>>x>>y>>c)
		{
			//m++;
			C[x][y]=c;
		}
		for(i=1;i<=n;i++)
		{
			d[i]=C[1][i];
			pre[i]=1;
		}
		M[1]=1;
		pre[1]=0;
		f.close();
}
void afisare()
{
	int i,j,lg,dr[maxvf];
	for(i=1;i<=n;i++)
		if(i!=1)
		{
			//g<<"costul minim de la "<<x0<<" la "<<i<<" este "<<d[i]<< "\n";
			//g<<"drumul de cost minim: ";
			g<<d[i]<<" ";
			dr[0]=i;
			lg=0;
			while(pre[dr[lg]])
			{
				lg++;
				dr[lg]=pre[dr[lg-1]];
			}
			//for(j=lg;j>=0;j--)
				//g<<" "<<dr[j]<<" ";
			//g<<"\n";
		}
}
int main()
{
	int i,vfmin,j;
	double dmin;
	initializare();
	for(j=1;j<n;j++)
	{
		dmin=inf;
		for(i=1;i<=n;i++)
			if(!M[i]&&dmin>d[i])
			{
				dmin=d[i];
				vfmin=i;
			}
			M[vfmin]=1;
			for(i=1;i<=n;i++)
				if(!M[i]&&d[i]>dmin+C[vfmin][i])
				{
					pre[i]=vfmin;
					d[i]=dmin+C[vfmin][i];
				}
	}
	afisare();
	return 0;
}