Pagini recente » Cod sursa (job #164758) | Cod sursa (job #468394) | Cod sursa (job #468500) | Cod sursa (job #3138877) | Cod sursa (job #2108710)
#include<fstream>
#include<vector>
#include<cstdio>
#define INF 1000000000
using namespace std;
int n, m, k, nr, i, j, ii, jj, x, y, z, lg;
int a[505][505], d[55][55][55], v[55], ff[505], dist[505][505], viz[505], d2[505], dest[55], h[505], poz[505];
vector<int> vec[505];
FILE * fin = fopen("team.in", "r");
ofstream fout("team.out");
void upd(int c){
int p = c / 2;
while(p > 0 && d2[ h[p] ] > d2[ h[c] ]){
swap(h[p], h[c]);
poz[ h[p] ] = p;
poz[ h[c] ] = c;
c = p;
p = c / 2;
}
}
void elim(int p){
int c = p + p;
while(c <= n){
if(c + 1 <= n && d2[ h[c] ] > d2[ h[c + 1] ]){
c++;
}
if(d2[ h[p] ] > d2[ h[c] ]){
swap(h[p], h[c]);
poz[ h[p] ] = p;
poz[ h[c] ] = c;
p = c;
c = p + p;
}
else{
break;
}
}
}
void djikstra(int srs){
int i, j, nod;
for(i = 1; i <= n; i++){
d2[i] = INF;
viz[i] = 0;
h[i] = poz[i] = i;
}
d2[srs] = 0;
upd(srs);
for(i = 1; i <= n; i++){
nod = h[1];
if(d2[nod] == INF){
continue;
}
viz[nod] = 1;
for(j = 0; j < vec[nod].size(); j++){
int vecin = vec[nod][j];
if(a[nod][vecin] != -1 && viz[vecin] == 0){
d2[vecin] = min(d2[vecin], d2[nod] + a[nod][vecin]);
upd(poz[vecin]);
}
}
dist[srs][nod] = dist[nod][srs] = d2[nod];
d2[nod] = INF;
elim(poz[nod]);
}
}
int main(){
fscanf(fin, "%d%d%d", &k, &n, &m);
for(i = 1; i <= m; i++){
fscanf(fin, "%d%d%d", &x, &y, &z);
a[x][y] = a[y][x] = z;
vec[x].push_back(y);
vec[y].push_back(x);
}
for(i = 1; i <= k; i++){
fscanf(fin, "%d", &dest[i]);
ff[ dest[i] ] = 1;
}
ff[1] = 1;
for(i = 1; i <= n; i++){
if(ff[i] == 1){
v[++nr] = i;
ff[i] = nr;
}
}
for(i = 1; i <= nr; i++){
djikstra(v[i]);
}
for(i = 1; i <= k; i++){
for(j = 1; j <= nr; j++){
d[i][i][j] = dist[ dest[i] ][ v[j] ];
}
}
for(lg = 2; lg <= k; lg++){
for(i = 1; i <= k - lg + 1; i++){
j = i + lg - 1;
for(ii = 1; ii <= nr; ii++){
d[i][j][ii] = INF;
for(jj = i; jj <= j; jj++){
d[i][j][ii] = min(d[i][j][ii], d[i][jj - 1][ ff[dest[jj] ] ] + d[jj + 1][j][ ff[ dest[jj] ] ] + dist[ dest[jj] ][ v[ii] ]);
}
}
}
}
fout<< d[1][k][1] <<"\n";
return 0;
}