Pagini recente » Cod sursa (job #1862158) | Cod sursa (job #1818794) | Cod sursa (job #2792052) | Cod sursa (job #1399195) | Cod sursa (job #3324278)
// 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(j=0;j<P;++j)
for(k=j;k<P;++k)
for(i=0;i<S;++i)
dp[j][k][i]=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[k][id[where[i]]]);
dp[i][j][k]=std::min(dp[i][j][k], dp[i][j-1][id[where[j]]]+dist[k][id[where[j]]]);
}
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][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;
}