Cod sursa(job #1451719)

Utilizator darrenRares Buhai darren Data 18 iunie 2015 11:07:15
Problema Team Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <cstring>
#include <fstream>
#include <algorithm>
#include <queue>
#include <vector>

using namespace std;

int P, N, M;
vector<pair<int, int> > V[502];
int dist[52][502];
priority_queue<pair<int, int> > Q;
vector<int> W[502];
int D[52];
int minC[52][52][52];
bool is[52];

void Dijkstra(int p, int x)
{
	memset(dist[p], 0x3f, sizeof(dist[p]));
	
	dist[p][x] = 0;
	Q.push(make_pair(0, x));
	
	while (!Q.empty())
	{
		auto now = Q.top();
		Q.pop();
		
		if (-now.first != dist[p][now.second]) continue;
		for (auto edge : V[now.second])
			if (-now.first + edge.second < dist[p][edge.first])
			{
				dist[p][edge.first] = -now.first + edge.second;
				Q.push(make_pair(-dist[p][edge.first], edge.first));
			}
	}
}

int main()
{
	ifstream fin("team.in");
	ofstream fout("team.out");
	
	fin >> P >> N >> M;
	for (int i = 1, nod1, nod2, cost; i <= M; ++i)
	{
		fin >> nod1 >> nod2 >> cost;
		V[nod1].push_back(make_pair(nod2, cost));
		V[nod2].push_back(make_pair(nod1, cost));
	}
	
	Dijkstra(0, 1);
	
	D[0] = 1;
	for (int i = 1; i <= P; ++i)
	{
		fin >> D[i];
		Dijkstra(i, D[i]);
		W[D[i]].push_back(i);
	}
	
	memset(minC, 0x3f, sizeof(minC));
	for (int s = 1; s <= P; ++s)
		for (int i = 1; i <= P - s + 1; ++i)
		{
			int j = i + s - 1;
			
			for (int k = 0; k <= P; ++k)
			{
				memset(is, 0, sizeof(is));
				for (int l = i; l <= j; ++l)
					minC[i][j][k] = min(minC[i][j][k], dist[k][D[l]] + (i <= l - 1 ? minC[i][l - 1][l] : 0) + (l + 1 <= j ? minC[l + 1][j][l] : 0));
			}
		}
	
	fout << minC[1][P][0] << '\n';
	
	fin.close();
	fout.close();
}