Cod sursa(job #3324283)

Utilizator Ilie_MityIlie Dumitru Ilie_Mity Data 21 noiembrie 2025 21:48:26
Problema Team Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.23 kb
// Ilie "The-Winner" Dumitru
// Dumnezeu sa o ierte
#include<bits/stdc++.h>
#define sz(x) ((int)(x).size())
#define all(x) (x).begin(), (x).end()
#define err(...) fprintf(stderr, __VA_ARGS__)
using ll=long long;
using dbl=long double;
constexpr int NMAX=512, PMAX=64;
constexpr ll MOD=1'000'000'007;

struct edge
{
	int node, cost;
};

struct state
{
	int node, cost;

	friend bool operator<(state a, state b)
	{
		return a.cost>b.cost;
	}
};

int P, N, M, S;
std::vector<edge> G[NMAX];
std::bitset<NMAX> dropOff;
int id[NMAX];
int dist[NMAX][NMAX];
int where[NMAX];
int dp[PMAX][PMAX][PMAX];

void dijkstra(int start)
{
	std::priority_queue<state> pq;
	std::vector<int> d(N, (int)MOD);

	d[start]=0;
	dist[id[start]][id[start]]=0;
	pq.push({start, 0});
	do
	{
		state s=pq.top();
		pq.pop();

		if(s.cost!=d[s.node])
			continue;
		if(id[s.node]>-1)
			dist[id[start]][id[s.node]]=s.cost;
		for(edge e : G[s.node])
			if(d[e.node]>s.cost+e.cost)
			{
				d[e.node]=s.cost+e.cost;
				pq.push({e.node, d[e.node]});
			}
	}while(!pq.empty());
}

void runDP()
{
	int i, j, k, l;

	for(i=0;i<P;++i)
		for(j=i;j<P;++j)
			for(k=0;k<S;++k)
				dp[i][j][k]=MOD;
	for(i=0;i<P;++i)
		dp[i][i][id[where[i]]]=0;

	for(i=P-1;i>-1;--i)
		for(j=i;j<P;++j)
		{
			for(k=0;k<S;++k)
			{
				if(i<j)
				{
					dp[i][j][k]=std::min(dp[i][j][k], dp[i+1][j][id[where[i]]]+dist[id[where[i]]][k]);
					dp[i][j][k]=std::min(dp[i][j][k], dp[i][j-1][id[where[j]]]+dist[id[where[j]]][k]);
				}
				for(l=i+1;l<j;++l)
					dp[i][j][k]=std::min(dp[i][j][k], dp[i][l-1][id[where[l]]]+dp[l+1][j][id[where[l]]]+dist[k][id[where[l]]]);
			}

			for(k=0;k<S;++k)
				for(l=0;l<S;++l)
					dp[i][j][k]=std::min(dp[i][j][k], dp[i][j][l]+dist[k][l]);
		}
}

int main()
{
	FILE* f=fopen("team.in", "r"), *g=fopen("team.out", "w");
	int i, a, b, c;

	fscanf(f, "%d%d%d", &P, &N, &M);
	for(i=0;i<M;++i)
	{
		fscanf(f, "%d%d%d", &a, &b, &c);
		--a;
		--b;
		G[a].push_back({b, c});
		G[b].push_back({a, c});
	}
	for(i=0;i<P;++i)
	{
		fscanf(f, "%d", &a);
		--a;
		dropOff[a]=1;
		where[i]=a;
	}
	dropOff[0]=1;

	for(i=a=0;i<N;++i)
	{
		id[i]=-1;
		if(dropOff[i])
			id[i]=a++;
	}
	S=a;

	for(i=0;i<N;++i)
		if(dropOff[i])
			dijkstra(i);

	runDP();

	fprintf(g, "%d\n", dp[0][P-1][0]);

	fclose(f);
	fclose(g);
	return 0;
}