Cod sursa(job #2108743)

Utilizator alexandra_udristoiuUdristoiu Alexandra Maria alexandra_udristoiu Data 18 ianuarie 2018 19:23:29
Problema Team Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.36 kb
#include<fstream>
#include<vector>
#include<cstdio>
#define INF 1000000000
#define DIM 100000
using namespace std;
int n, m, k, nr, i, j, ii, jj, x, y, z, lg, r;
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];
char s[DIM + 5];
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 num(){
    while( (s[r] < '0' || s[r] > '9') && s[r] != '-'){
        r++;
        if(r == DIM){
            fread(s, 1, DIM, fin);
            r = 0;
        }
    }
    int ok = 0;
    if(s[r] == '-'){
        ok = 1;
        r++;
        if(r == DIM){
            fread(s, 1, DIM, fin);
            r = 0;
        }
    }
    int x = 0;
    while(s[r] >= '0' && s[r] <= '9'){
        x = x * 10 + s[r] - '0';
        r++;
        if(r == DIM){
            fread(s, 1, DIM, fin);
            r = 0;
        }
    }
    if(ok == 1){
        x = -x;
    }
    return x;
}
int main(){
    fread(s, 1, DIM, fin);
    k = num(); n = num(); m = num();
    for(i = 1; i <= m; i++){
        x = num(); y = num(); z = num();
        a[x][y] = a[y][x] = z;
        vec[x].push_back(y);
        vec[y].push_back(x);
    }
    for(i = 1; i <= k; i++){
        dest[i] = num();
        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;
}