Cod sursa(job #694022)

Utilizator alexdmotocMotoc Alexandru alexdmotoc Data 27 februarie 2012 18:10:19
Problema Ubuntzei Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <cstdio>
#include <queue>
#include <vector>
#include <iostream>
#include <algorithm>

using namespace std;

#define maxN 10005
#define INF 0x3f3f3f3f

int N , M , K;
int cost[maxN][maxN] , minim;

vector <int> C;

void roy_floyd ()
{
	for (int k = 1 ; k <= N ; ++k)
		for (int i = 1 ; i <= N ; ++i)
			for (int j = 1 ; j <= N ; ++j)
			{
				if (i == j) continue;
				
				cost[i][j] = min (cost[i][j] , cost[i][k] + cost[k][j]);
			}
}


void solve ()
{
	int costcur = cost[1][C[0]];
	
	for (int i = 0 ; i < K - 1 ; ++i)
		costcur += cost[C[i]][C[i + 1]];
	
	costcur += cost[C[K - 1]][N];
	
	if (costcur < minim)
		minim = costcur;
}


int main ()
{
	freopen ("ubuntzei.in" , "r" , stdin);
	freopen ("ubuntzei.out" , "w" , stdout);
	
	scanf ("%d %d" , &N , &M);
	
	scanf ("%d" , &K);
	
	int xx;
	
	for (int i = 1 ; i <= K ; ++i)
	{
		scanf ("%d" , &xx);
		C.push_back (xx);
	}
	
	
	for (int i = 1 ; i <= N ; ++i)
		for (int j = 1 ; j <= N ; ++j)
			cost[i][j] = INF;
	
	
	for (int i = 1 ; i <= N ; ++i)
		cost[i][i] = 0;
	
	int a , b , c;
	
	for (int i = 1 ; i <= M ; ++i)
	{
		scanf ("%d %d %d" , &a , &b , &c);
		
		cost[a][b] = c;
		cost[b][a] = c;
	}
	
	
	minim = INF;
	
	roy_floyd ();
	sort (C.begin () , C.end ());
	
	do 
	{
		solve ();
	}

	while (next_permutation (C.begin () , C.end ()));
	
	
	if (K > 0)
		printf ("%d" , minim);
	
	else printf ("%d" , cost[1][N]);
	
	return 0;
}