Cod sursa(job #1566853)

Utilizator sebinechitasebi nechita sebinechita Data 12 ianuarie 2016 18:12:32
Problema Team Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin("team.in");
ofstream fout("team.out");
#define INF 1000000000
#define MAX 510
#define MAXP 54
int C[MAX][MAX], valid[MAX], d[MAX], cat[MAX];
int rez[MAXP][MAXP][MAXP], viz[MAXP][MAXP][MAXP];
int rezultat(int st, int dr, int k)
{
	if(st > dr)
		return 0;
	if(viz[st][dr][k])
		return rez[st][dr][k];
	viz[st][dr][k] = 1;
	rez[st][dr][k] = INF;
	for(int i = st ; i <= dr ; i++)
	{
		rez[st][dr][k] = min(rez[st][dr][k], rezultat(st, i - 1, d[i]) + rezultat(i + 1, dr, d[i]) + C[cat[k]][cat[d[i]]]);
	}
	
	return rez[st][dr][k];
}

int main()
{
	int p, n, m, c, x, y, i, j, k, s;
	fin >> p;
	fin >> n;
	fin >> m;
	while(m--)
	{
		fin >> x >> y >> c;
		C[x][y] = c + 1;
		C[y][x] = c + 1;
	}
	for(i = 1 ; i <= n ; i++)
	{
		for(j = 1 ; j <= n ; j++)
		{
			if(C[i][j] == 0)
				C[i][j] = INF;
			else
				C[i][j]--;
		}
	}
	for(k = 1 ; k <= n ; k++)
	{
		for(i = 1 ; i <= n ; i++)
		{
			for(j = 1 ; j <= n ; j++)
			{
				C[i][j] = min(C[i][j], C[i][k] + C[k][j]);
			}
		}
	}
	for(i = 1 ; i <= n ; i++)
	{
		C[i][i] = 0;
	}
	for(i = 1 ; i <= p ; i++)
	{
		fin >> d[i];
		valid[d[i]] = 1;
	}
	s = 0;
	valid[1] = 1;
	for(i = 1 ; i <= n ; i++)
	{
		if(valid[i])
		{
			valid[i] = ++s;
			cat[s] = i;
		}
	}	
	for(i = 1 ; i <= p ; i++)
	{
		d[i] = valid[d[i]];
	}
	fout << rezultat(1, p, 1) << "\n";
}