Cod sursa(job #731897)

Utilizator klamathixMihai Calancea klamathix Data 9 aprilie 2012 13:34:08
Problema Team Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 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 mark[maxp];
bool calc[maxn][maxp][maxp];

int ret(int nod, int left, int right) {
	
	int i , l , r;
	if(calc[nod][left][right])
		return dp[nod][left][right];
	
	memset(mark , 0 , sizeof(mark));
	bool ok = false;
	
	for(i = left; i <= right; ++i)
		if(dest[i] == nod) {
			ok = true;
			mark[i] = true;
		}
		
	if(ok) {
		
		int ans = 0;
		
		for(i = left; i <= right; ++i) {
			if(!mark[i] && (mark[i - 1] || (i - 1) == left - 1)) 
				l = i;
			if(!mark[i] && (mark[i + 1] || (i + 1) == right + 1)) {
				r = i;
				ans += ret(nod , l , r);
			}
		}
		
		calc[nod][left][right] = true;
		dp[nod][left][right] = ans;
		
		return ans;
	}
	
	int ans = inf;
	
	for(i = left; i <= right; ++i)
		ans = min(ans, ret(dest[i], left , right) + d[nod][dest[i]]);

	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]);
	
	for(i = 1; i <= p; ++i)
		scanf("%d",&dest[i]);
	
	printf("%d\n",ret(1 , 1 , p));
	
return 0;
}