Cod sursa(job #2108647)

Utilizator alexandra_udristoiuUdristoiu Alexandra Maria alexandra_udristoiu Data 18 ianuarie 2018 17:49:29
Problema Team Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.96 kb
#include<fstream>
#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];
ifstream fin("team.in");
ofstream fout("team.out");
void djikstra(int srs){
    int i, j, nod;
    for(i = 0; i <= n; i++){
        d2[i] = INF;
        viz[i] = 0;
    }
    d2[srs] = 0;
    for(i = 1; i <= n; i++){
        nod = 0;
        for(j = 1; j <= n; j++){
            if(viz[j] == 0 && d2[j] < d2[nod]){
                nod = j;
            }
        }
        viz[nod] = 1;
        for(j = 1; j <= n; j++){
            if(a[nod][j] != -1 && viz[j] == 0){
                d2[j] = min(d2[j], d2[nod] + a[nod][j]);
            }
        }
    }
    for(j = 1; j <= n; j++){
        dist[srs][j] = dist[j][srs] = d2[j];
    }
}
int main(){
    fin>> k >> n >> m;
    for(i = 1; i <= n; i++){
        for(j = 1; j <= n; j++){
            a[i][j] = -1;
        }
    }
    for(i = 1; i <= m; i++){
        fin>> x >> y >> z;
        a[x][y] = a[y][x] = z;
    }
    for(i = 1; i <= k; i++){
        fin>> 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;
}