Pagini recente » Cod sursa (job #697942) | Cod sursa (job #1383804) | Cod sursa (job #1451240) | Cod sursa (job #280063) | Cod sursa (job #194871)
Cod sursa(job #194871)
#include <cstdio>
#include <queue>
#include <algorithm>
#include <list>
#include <vector>
using namespace std;
#define pb push_back
#define mp make_pair
#define f first
#define s second
#define MAX_N 510
#define MAX_B 5000
#define MAX_P 55
typedef list< pair<int,int> > lii;
int D[MAX_N];
struct comp { bool operator()(int a, int b) { return D[a] > D[b]; } };
lii G[MAX_N];
int dest[MAX_P];
int n,m,p;
int Dist[MAX_N][MAX_N];
int get( char* &c ) {
int nr = 0;
while ( !(*c>='0' && *c<='9') ) ++c;
while ( *c>='0' && *c<='9' ) { nr *= 10; nr += *c-'0'; ++c; }
return nr;
}
void load_data() {
char buff[MAX_B], *ch;
freopen( "team.in", "r", stdin );
scanf("%d %d %d\n", &p, &n, &m);
while ( m-- ) {
int x, y, c;
fgets( buff, MAX_B, stdin );
x = get( ch=buff ); y = get( ++ch ); c = get( ++ch );
G[x].push_back( mp(y,c) );
G[y].push_back( mp(x,c) );
}
for ( int i=0; i<p; ++i )
scanf("%d", dest+i);
dest[p++] = 1;
}
priority_queue<int, vector<int>, comp> Q;
bool enq[MAX_N];
void dijkstrize() {
int U[MAX_N]; memset(U, 0, sizeof(U));
for (int i=0; i<p; ++i) {
if ( U[ dest[i] ] ) continue;
int x = dest[i]; U[ x ] = 1;
memset( D, 0x3f, sizeof(D) );
memset( enq, 0, sizeof(enq));
D[ x ] = 0; enq[x] = 1; Q.push(x);
while ( ! Q.empty() ) {
int fr = Q.top();
for ( lii::iterator ii=G[fr].begin(); ii!=G[fr].end(); ++ii )
if ( D[ii->f] > D[fr] + ii->s ) {
D[ii->f] = D[fr] + ii->s;
if ( !enq[ii->f] ) Q.push(ii->f), enq[ii->f] = 1;
}
Q.pop(); // enq[fr] = 0;
}
for (int j=0; j<p; ++j)
Dist[x][dest[j]] = D[ dest[j] ];
}
}
int A[MAX_N][MAX_P][MAX_P]; // 1MB
int DP() {
int i, j, k, l;
// init
for ( i=1; i<=n; ++i )
for ( j=0; j<p; ++j )
for ( k=0; k<p; ++k ) {
if ( j>k ) A[i][j][k] = 0;
if ( j==k ) A[i][j][k] = Dist[i][dest[j]];
if ( j<k ) A[i][j][k] = 0x3fffffff;
}
// solve
for ( l=2; l<p; ++l ) {
for ( i=0; i<p; ++i ) // suntem in orasul dest[i]
for ( j=0; j+l-1<p; ++j ) { // avem in taxi intre j..j+l-1
for ( k=j; k<=j+l-1; ++k )
A[dest[i]][j][j+l-1] = min( A[dest[i]][j][j+l-1], A[dest[k]][j][k-1]+A[dest[k]][k+1][j+l-1]+Dist[dest[i]][dest[k]] );
}
}
return A[1][0][p-2];
}
int main() {
load_data();
dijkstrize();
fprintf( fopen("team.out", "w"), "%d\n", DP() );
return 0;
}