Pagini recente » Statistici Nicolae (nicu122) | Cod sursa (job #478614) | Cod sursa (job #2224828) | Cod sursa (job #276150) | Cod sursa (job #732069)
Cod sursa(job #732069)
#include<stdio.h>
#include<vector>
#define maxp 53
#define maxn 505
#define INF (1<<29)
#define pb push_back
#define mp make_pair
using namespace std;
FILE*f=fopen("team.in","r");
FILE*g=fopen("team.out","w");
int n,m,p;
int C[maxp][maxn],D[maxn],viz[maxn],opt[maxp][maxp][maxp],A[maxp];
vector< pair<int,int> >G[maxn];
inline int min ( const int &a , const int &b ){
return a <= b ? a : b;
}
inline void citire () {
fscanf(f,"%d %d %d",&p,&n,&m);
int x,y,c;
for ( int i = 1 ; i <= m ; ++i ){
fscanf(f,"%d %d %d",&x,&y,&c);
G[x].pb(mp(y,c));
G[y].pb(mp(x,c));
}
for ( int i = 1 ; i <= p ; ++i ){
fscanf(f,"%d",&A[i]);
}
}
inline void distante () {
D[0] = INF;
for ( int ii = 1 ; ii <= p ; ++ii ){
int nod = A[ii];
for ( int i = 1 ; i <= n ; ++i ){
D[i] = INF; viz[i] = 0;
}
D[nod] = 0;
for ( int i = 1 ; i <= n ; ++i ){
int best = 0;
for ( int j = 1 ; j <= n ; ++j ){
if ( !viz[j] && D[j] < D[best] ){
best = j;
}
}
viz[best] = 1;
for ( vector< pair<int,int> >::iterator itt = G[best].begin() ; itt != G[best].end() ; ++itt ){
int nodvcn = itt->first;
if ( D[nodvcn] > D[best] + itt->second ){
D[nodvcn] = D[best] + itt->second;
}
}
}
for ( int i = 1 ; i <= n ; ++i ){
C[ii][i] = D[i];
}
}
}
inline void rezolva () {
for ( int l = 2 ; l <= p ; ++l ){
for ( int i = 1 ; i + l - 1 <= p ; ++i ){
int j = i + l - 1;
for ( int k = i ; k <= j ; ++k ){
int min1 = INF; //i;k-1
for ( int u = i ; u <= k - 1 ; ++u ){
min1 = min(min1,opt[i][k-1][u]+C[u][A[k]]);
}
int min2 = INF; //k+1;j
for ( int u = k + 1 ; u <= j ; ++u ){
min2 = min(min2,opt[k+1][j][u]+C[u][A[k]]);
}
if ( min1 == INF ) min1 = 0;
if ( min2 == INF ) min2 = 0;
opt[i][j][k] = min1 + min2;
}
}
}
int sol = INF;
for ( int i = 1 ; i <= p ; ++i ){
sol = min(sol,opt[1][p][i]+C[i][1]);
}
fprintf(g,"%d\n",sol);
}
int main () {
citire();
distante();
rezolva();
fclose(f);
fclose(g);
return 0;
}