Cod sursa(job #919709)

Utilizator ELHoriaHoria Cretescu ELHoria Data 19 martie 2013 19:45:40
Problema Team Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <fstream>
#include <vector>
#include <queue>
#include <bitset>
#define MP make_pair
#define PB push_back
#define x first
#define y second
#define PII pair<int,int>

using namespace std;

ifstream fin("team.in");
ofstream fout("team.out");

const int INF = int(1e9);
int P , N , M , dest[52] , C[52][52] , cost[52][52][52] , D[502];
vector< PII > G[502];
bitset<502> use;

struct cmp{	bool operator() (const int &x,const int &y)
	const {return D[x] > D[y];}
};

priority_queue<int,vector<int>,cmp> h;

void read_data()
{
	freopen("team.in","r",stdin);
	freopen("team.out","w",stdout);
	scanf("%d %d %d",&P,&N,&M);
	for(int x , y , c;M;M--)
	{
		scanf("%d %d %d",&x,&y,&c);
		G[x].PB(MP(y,c));
		G[y].PB(MP(x,c));
	}
	dest[0] = 1;
	for(int i = 1;i <= P;++i)
		scanf("%d",&dest[i]);
}

void djikstra(int S)
{
	for(int i = 1;i <= N;++i) D[i] = INF , use[i] = 0;
	for(h.push(S) , D[S] = 0 , use[S] = 1;!h.empty();)
	{
		int v = h.top(); h.pop(); use[v] = 0;
		for(vector< PII >::const_iterator w = G[v].begin(); w != G[v].end();++w)
			if(D[w->x] > D[v] + w->y)
			{
				D[w->x] = D[v] + w->y;
				if(use[w->x] == 0) h.push(w->x) , use[w->x] = 1;
			}
	}
}

int memo(int i,int j,int k)
{
	if(cost[i][j][k] != INF) return cost[i][j][k];
	if(i > j) return 0;
	for(int q = i; q <= j;++q)
		cost[i][j][k] = min(cost[i][j][k],memo(i,q - 1,q) + memo(q + 1,j,q) + C[k][q]);
	return cost[i][j][k];
}

int main()
{
	read_data();
	for(int i = 0;i <= P;++i)
		for(int j = 0;j <= P;++j)
			for(int k = 0;k <= P;++k)
				cost[i][j][k] = INF;
	for(int i = 0;i <= P;++i)
	{
		djikstra(dest[i]);
		for(int j = 0; j <= P;++j)
			C[i][j] = D[dest[j]];
	}
	printf("%d",memo(1,P,0));
	return 0;
}