Cod sursa(job #731960)

Utilizator klamathixMihai Calancea klamathix Data 9 aprilie 2012 14:38:46
Problema Team Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include<cstdio>
#include<cstring>
#include<algorithm>
const int inf = 1000 * 1000 * 1000;
using namespace std;

const int maxn = 505;
const int maxp = 55;

int i , j , n , m , p , a , b , c , d[maxn][maxn] , dp[maxn][maxp][maxp], dest[maxn] , k;
bool calc[maxn][maxp][maxp];

int ret(int nod, int left, int right) {
	
	if(left > right)
		return 0;
	
	int ans = inf;
	int i , l , r;
	if(calc[nod][left][right])
		return dp[nod][left][right];
	
	bool ok = false;
	
	
	for(i = left; i <= right; ++i) 
		ans = min(ans , ret(dest[i] , left , i - 1) + ret(dest[i] , i + 1 , right) + d[nod][dest[i]]);
	
	//printf("%d %d %d  %d\n",nod,left,right , ans);
	
	calc[nod][left][right] = true;
	dp[nod][left][right] = ans;
	return ans;
}

int main()
{
	freopen("team.in","r",stdin);
	freopen("team.out","w",stdout);
	
	scanf("%d\n%d\n%d",&p,&n,&m);
	
	for(i = 1; i <= n; ++i)
		for(j = 1; j <= n; ++j)
			d[i][j] = inf;
	
	for(i = 1; i <= m; ++i) {
		scanf("%d %d %d",&a,&b,&c);
		d[a][b] = d[b][a] = c;
	}
	
	for(k = 1; k <= n; ++k)
		for(i = 1; i <= n; ++i)
			for(j = 1 ; j <= n ; ++j)
				if(i != j)
					d[i][j] = min(d[i][k] + d[k][j], d[i][j]);
				else
					d[i][j] = 0;
				
	for(i = 1; i <= p; ++i)
		scanf("%d",&dest[i]);
	
	//ret(2 , 3 , 4);
	
	printf("%d\n",ret(1 , 1 , p));
	
return 0;
}