Cod sursa(job #693889)

Utilizator alexdmotocMotoc Alexandru alexdmotoc Data 27 februarie 2012 17:34:46
Problema Ubuntzei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <cstdio>
#include <queue>
#include <vector>
#include <iostream>
#include <algorithm>

using namespace std;

#define maxN 2005
#define INF 0x3f3f3f3f
#define PB push_back

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

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[1]];
	
	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);
	
	for (int i = 1 ; i <= K ; ++i)
	{
		scanf ("%d" , &nr);
		
		C.PB (nr);
	}
	
	
	for (int i = 1 ; i <= N ; ++i)
		for (int j = 1 ; j <= N ; ++j)
			cost[i][j] = INF;
	
	
	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 ();
	
	do 
	{
		solve ();
	}
	
	while (next_permutation (C.begin () , C.end ()));
	
	
	printf ("%d" , minim);
	
	return 0;
}