Cod sursa(job #621952)

Utilizator balakraz94abcd efgh balakraz94 Data 16 octombrie 2011 23:23:17
Problema Ubuntzei Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include<cstdio>
#include<vector>
#define infile "ubuntzei.in"
#define outfile "ubuntzei.out"
#define n_max 2005
#define INF 999999999
using namespace std;

int c[n_max][n_max];

int nr[n_max], uz[n_max];

int n, K;




void citeste()
{
	freopen(infile,"r",stdin);
	
	int m, x, y, cost;
	
	scanf("%d %d",&n,&m);
	
	scanf("%d",&K);
	
	for(int i=1;i<=K;i++)
		scanf("%d",&nr[i]);
	
	while(m--)
	{
		scanf("%d %d %d",&x,&y,&cost);
		
		c[x][y] = c[y][x] = cost;
	}
	
	fclose(stdin);
}


int back(int k, int ant)//aacum selectez al k-lea element, cu tatal ant
{
	if(k > K)
		return c[ant][n];
	
	int minim = INF, rez;
	
	for(int i=1;i<=K;i++)
		if( c[ant][nr[i]] && !uz[nr[i]] )
		{
			uz[nr[i]] = 1;
			
			rez = back(k+1, nr[i]);
			
			uz[nr[i]] = 0;
			
			if(rez + c[ant][nr[i]] < minim)
				minim = rez + c[ant][nr[i]];
		}
		
	return minim;
}



void rezolva()
{
	for(int k=1;k<=n;k++)
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
				if(c[i][k] && c[k][j] && ( c[i][k] + c[k][j] < c[i][j] || !c[i][j]) && i!=j)
					c[i][j] = c[i][k] + c[k][j];
}




void afiseaza()
{
	freopen(outfile,"w",stdout);
	
	printf("%d\n", back(1,1));
	
	fclose(stdout);
}


int main()
{
	citeste();
	rezolva();
	afiseaza();
	
	return 0;
}