Cod sursa(job #731985)

Utilizator klamathixMihai Calancea klamathix Data 9 aprilie 2012 15:16:20
Problema Team Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.92 kb
#include<cstdio>
#include<vector>
#include<queue>
#include<cstring>
#include<bitset>
#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], done[maxn] , used[maxn];

bitset<maxn> in_queue;

queue <int> Q;
vector <int> G[maxn] , C[maxn];

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]]);
		if(ans == 0) break;
	}
	
	//printf("%d %d %d  %d\n",nod,left,right , ans);
	
	calc[nod][left][right] = true;
	dp[nod][left][right] = ans;
	return ans;
}

void Dijkstra(int nod)
{
	int i , j;
	
	if(done[nod]) return;
	done[nod] = true;
	
	memset(used, 0 , sizeof(used));
	
	for(i = 1; i <= n; ++i)
		d[nod][i] = inf;
	
	d[nod][nod] = 0;
	
	for(i = 1; i <= n; ++i) {
		
		int minn = inf , ind = 0;
		
		for(j = 1; j <= n; ++j)
			if(!used[j] && d[nod][j] < minn) {
				minn = d[nod][j];
				ind = j;
			}
			
		used[ind] = true;
		
		for(j = 0; j < G[ind].size(); ++j)
			if(d[nod][ind] + C[ind][j] < d[nod][G[ind][j]])
				d[nod][G[ind][j]] = d[nod][ind] + C[ind][j];
	}
}

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 <= m; ++i) {
		scanf("%d %d %d",&a,&b,&c);
		G[a].push_back(b);
		C[a].push_back(c);
		G[b].push_back(a);
		C[b].push_back(c);
	}
	
	
	
	for(i = 1; i <= p; ++i)
		scanf("%d",&dest[i]);
	
	Dijkstra(1);
	
	for(i = 1 ; i <= p ; ++i)
		Dijkstra(dest[i]);
				
	
	
	printf("%d\n",ret(1 , 1 , p));
	
	
return 0;
}