Cod sursa(job #764028)

Utilizator FcBarcelonaFC Barcelona FcBarcelona Data 3 iulie 2012 20:13:34
Problema Team Scor 65
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include<fstream>
#include<vector>
#include<queue>
using namespace std;

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

const int N = 510;
const int P = 52;
const int inf = 1000000000;

int p, n, m, dist[P][N], dest[P], d[P][P][P];
vector<pair<int, int> > v[N];

void calc(int nr, int nod) {
	queue<int> q;
	bool ver[N];
	q.push(nod);
	
	for(int i = 1; i<=n; ++i)
		dist[nr][i] = inf, ver[i] = false;
	dist[nr][nod] = 0; ver[nod] = true;
	
	while(!q.empty()) {
		int el = q.front();
		q.pop();
		
		for(vector<pair<int, int> >::iterator it = v[el].begin(); it!=v[el].end(); ++it)
			if(dist[nr][it->first] > dist[nr][el] + it->second) {
				dist[nr][it->first] = dist[nr][el] + it->second;
				if(!ver[it->first]){
					q.push(it->first);
					ver[it->first] = true;
				}
			}
		ver[el] = false;
	}
}

int din(int i, int j, int k) {
	if(d[i][j][k] || i>j)
		return d[i][j][k];
	
	int l;
	d[i][j][k] = inf;
	
	for(l = i; l <= j; ++l)
		d[i][j][k] = min(d[i][j][k], din(i, l - 1, l) + din(l + 1, j, l) + dist[l][dest[k]]);
	return d[i][j][k];
}

int main() {
	int i, a, b, c;
	
	in >> p >> n >> m;
	
	for(i = 1; i<=m; ++i) {
		in >> a >> b >> c;
		v[a].push_back(pair<int, int>(b, c));
		v[b].push_back(pair<int, int>(a, c));
	}
	
	for(i = 1; i<=p; ++i) {
		in >> dest[i];
		calc(i, dest[i]);
	}
	dest[0] = 1;
	out << din(1, p, 0) << "\n";
}