Cod sursa(job #642558)

Utilizator tudorsTudor Siminic tudors Data 1 decembrie 2011 17:38:19
Problema Ubuntzei Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <fstream>
#include <iostream>
#define INF 10000000
using namespace std;
typedef struct {int nro,cost;} EL;
ifstream fi("ubuntzei.in");
ofstream fo("ubuntzei.out");
int N,M,K,i,j,C[20];
int x,y,z;
int COST[2001][2001];
int S[20];
int rez;
int vf;
int CMIN[2001],X[2001];
int DIJK[20][2001];
int cv,v,p;

void g(int k)
{
	int suma,i,j,t;
	if (k==K)
	{
		// se calculeaza suma costurilor minime
		suma=DIJK[0][C[S[1]]];
		for (i=1;i<=K-1;i++)
			suma=suma+DIJK[S[i]][C[S[i+1]]];
		suma=suma+DIJK[S[K]][N];
		if (suma<rez)
			rez=suma;
	}
	else
		for (i=1;i<=K;i++)
		{
			S[k+1]=i;
			t=1;
			for (j=1;j<=k;j++)
				if (S[j]==i)
					t=0;
			if (t==1)
				g(k+1);
		}
}
int main()
{
	fi>>N>>M;
	fi>>K;
	for (i=1;i<=K;i++)
		fi>>C[i];
	for (i=1;i<=N;i++)
		for (j=1;j<=N;j++)
			if (i==j)
				COST[i][j]=0;
			else
				COST[i][j]=INF;
	for (i=1;i<=M;i++)
	{
		fi>>x>>y>>z;
		COST[x][y]=COST[y][x]=z;
	}
	fi.close();
	// se obtine sirul costului minim de deplasare in DIJK
	C[0]=1;
	for (vf=0;vf<=K;vf++)
	{
		for (i=1;i<=N;i++)
			X[i]=0;
		X[C[vf]]=1;
		for (i=1;i<=N;i++)
			CMIN[i]=COST[C[vf]][i];
		for (p=1;p<=N-1;p++)
		{
			v=0;
			cv=INF;
			for (i=1;i<=N;i++)
				if (X[i]==0 && CMIN[i]<cv)
				{
					cv=CMIN[i];
					v=i;
				}
			X[v]=1;
			for (i=1;i<=N;i++)
				if (CMIN[i]>cv+COST[v][i])
					CMIN[i]=cv+COST[v][i];
		}
		for (i=1;i<=N;i++)
			DIJK[vf][i]=CMIN[i];
	}
	/*
	for (i=1;i<=N;i++)
		cout<<DIJK[1][i]<<" ";
	*/
	rez=INF;
	g(0);
	fo<<rez;
	fo.close();
	return 0;
}