Cod sursa(job #693914)

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

using namespace std;

#define maxN 2005
#define INF 0x3f3f3f3f

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

int x[20];

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;
				
				if (cost[i][k] == 0 || cost[k][j] == 0) continue;
				
				if (cost[i][k] + cost[k][j] < cost[i][j] || cost[i][j] == 0)
					cost[i][j] = cost[i][k] + cost[k][j];
			}
}


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


bool valid (int k)
{
	for (int i = 1 ; i < k ; ++i)
		for (int j = i + 1 ; j <= k ; ++j)
			if (x[i] == x[j])
				return 0;
	
	return 1;
}


void back (int k)
{
	for (int i = 1 ; i <= K ; ++i)
	{
		x[k] = C[i];
		
		if (valid (k))
			if (k == K)
				solve ();
			
			else back (k + 1);
	}
}


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" , &C[i]);
	
	
	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 ();
	back (1);
	
	/*for (int i = 1 ; i <= N ; ++i)
	{
		for (int j = 1 ; j <= N ; ++j)
			if (cost[i][j] != INF)
				cout << cost[i][j] << " ";
			
			else cout << "INF ";
			
		cout << "\n";
	}*/

	
	printf ("%d" , minim);
	
	return 0;
}