Cod sursa(job #422388)

Utilizator radu_cppRadu Voroneanu radu_cpp Data 22 martie 2010 16:51:47
Problema Team Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 kb
#include <stdio.h>
#include <algorithm>
#include <vector>
#include <queue>
#define INF 1000000000
#define MAXN 610
#define MAXP 61

using namespace std;

vector <pair<int, int> > G[MAXN];
int A[MAXN][MAXN];
int dest[MAXP];
int drum[MAXP][MAXP];
int Dij[MAXN];
bool ok[MAXN];
int d[MAXP][MAXP][MAXP];
int i,n,m,p,j,k,x,y,c;
queue<int> Q;
inline void BellmanFord(int nod)
{
	int i;
	for (i=1; i<=n; i++)
		Dij[i] = INF;
	Dij[nod] = 0;
	memset(ok,false,sizeof(ok));
	ok[nod] = true;
	Q.push(nod);
	while (!Q.empty()){
		nod = Q.front();
		Q.pop();
		ok[nod] = false;
		for (i=0; i<G[nod].size(); i++)
			if (Dij[G[nod][i].first] > Dij[nod] + G[nod][i].second){
				Dij[G[nod][i].first] = Dij[nod] + G[nod][i].second;
				if (!ok[G[nod][i].first]){
					ok[G[nod][i].first] = true;
					Q.push(G[nod][i].first);
				}
			}
	}
}

inline int calcul(int x, int y, int source)
{
	if (x>y) return 0;
	if (x==y&&y==source) return 0;
	if (d[x][y][source]<INF) return d[x][y][source];
	int aux;
	d[x][y][source] = INF;
	for (aux=x; aux<=y; aux++)
		d[x][y][source] = min(d[x][y][source], calcul(x,aux-1,aux)+calcul(aux+1,y,aux)+drum[source][aux]);
	return d[x][y][source];
}

int main()
{
	freopen("team.in","r",stdin);
	freopen("team.out","w",stdout);
	scanf("%d",&p);
	scanf("%d",&n);
	scanf("%d",&m);
	for (i=1; i<=n; i++)
		for (j=1; j<=n; j++)
			A[i][j] = INF;
	for (i=1; i<=m; i++){
		scanf("%d %d %d",&x,&y,&c);
		A[x][y] = A[y][x] = c;
		G[x].push_back(make_pair(y,c));
		G[y].push_back(make_pair(x,c));
	}
	for (i=1; i<=p; i++)
		scanf("%d",&dest[i]);
	dest[0] = 1;
	for (i=0; i<=p; i++){
		BellmanFord(dest[i]);
		for (j=0; j<=p; j++)
			drum[i][j] = Dij[dest[j]];
	}
	for (i=0; i<=p; i++)
		for (j=0; j<=p; j++)
			for (k=0; k<=p; k++)
				d[i][j][k] = INF;
	printf("%d\n",calcul(1,p,0));
	return 0;
}