Cod sursa(job #672865)

Utilizator noobakafloFlorin eu noobakaflo Data 3 februarie 2012 12:14:51
Problema Ubuntzei Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include<iostream>
#include<fstream>
using namespace std;

#define MAX_N 1000
#define INF 9999999

int n,m,nr_p,C[MAX_N][MAX_N],Urm[MAX_N][MAX_N],Priet[MAX_N];

void initializare(void)
{
	int i,j;
	for(i=1; i<=n; i++)
		for(j=1; j<=n; j++)
			if(i==j)
				C[i][j]=0;
			else
				C[i][j]=INF;
}
	
void citeste_graf(void)
{
	int i,x,y,c;
	fstream f("ubuntzei.in",ios::in);
	f>>n>>m;
	f>>nr_p;
	for(i=1; i<=nr_p; i++)
		f>>Priet[i];
	
	initializare();
	for(i=1; i<=m; i++)
	{
		f>>x>>y>>c;
		C[x][y]=c;
	}
	
	f.close();
}

void roy_floyd(void)
{
	int k,i,j;
	
	
	for(i=1; i<=n; i++)
		for(j=1; j<=n; j++)
			if(C[i][j]!=0 && C[i][j]!=INF) 
				Urm[i][j]=j;  			
			else                                 
				Urm[i][j]=0;                       
			
	for(k=1; k<=n; k++)
		for(i=1; i<=n; i++)
			for(j=1; j<=n; j++)
				if(C[i][j]>C[i][k]+C[k][j])   
				{
					C[i][j]=C[i][k]+C[k][j];
					Urm[i][j]=Urm[i][k];       
				}
}

void formeaza_drum(int d[MAX_N],int &k,int i,int j)
{
	d[k++]=i;
	if(i!=j)
		formeaza_drum(d,k,Urm[i][j],j);
	else
		return;
}

void afisare_solutie(int d[MAX_N],int k)
{
	fstream g("ubuntzei.out",ios::out);
	int i,lmin=0;
	for(i=0; i<k-1; i++)
		lmin+=C[d[i]][d[i+1]];
	g<<lmin;
	g.close();
}

int main()
{
	int d[MAX_N],k=0;
	citeste_graf(); 
	roy_floyd();
	formeaza_drum(d,k,1,n);
	afisare_solutie(d,k);
	
	return 0;
}