Cod sursa(job #1791010)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 28 octombrie 2016 23:12:37
Problema Team Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 kb
#include <cstdio>
#include <utility>
#include <vector>
#include <cstring>

#define myc std::pair <int, int>
#define mp std::make_pair
#define x first
#define y second

#define INF 1000000000

#define MAXK 50
#define MAXN 500

std::vector <myc> v[MAXN+1];
int n, d[MAXN+1][MAXN+1], ans[MAXK+1][MAXK+1][MAXN+1], t[MAXK+1];
bool viz[MAXN+1];

inline int min2(int a, int b){
    if(a<b) return a;
    else return b;
}

int solve(int st, int dr, int x){
    if(st>dr) return 0;
    if(ans[st][dr][x]!=INF) return ans[st][dr][x];
    for(int i=st; i<=dr; i++) ans[st][dr][x]=min2(ans[st][dr][x], solve(st, i-1, t[i])+solve(i+1, dr, t[i])+d[x][t[i]]);
    return ans[st][dr][x];
}

inline void dijkstra(int sursa){
    int best, x;
    memset(viz, 0, sizeof viz);
    for(int i=0; i<=n; i++)
        d[sursa][i]=INF;
    d[sursa][sursa]=0;
    viz[sursa]=1;
    best=sursa;
    for(int i=2; i<=n; i++){
        x=best;
        best=0;
        for(int i=v[x].size()-1; i>=0; i--)
            if(!viz[v[x][i].x])
                d[sursa][v[x][i].x]=min2(d[sursa][v[x][i].x], d[sursa][x]+v[x][i].y);
        for(int i=1; i<=n; i++)
            if(!viz[i])
                if(d[sursa][i]<d[sursa][best])
                    best=i;
        viz[best]=1;
    }
}

int main(){
    int k, m, x, y, z;
    FILE *fin, *fout;
    fin=fopen("team.in", "r");
    fout=fopen("team.out", "w");
    fscanf(fin, "%d%d%d", &k, &n, &m);
    for(int i=0; i<m; i++){
        fscanf(fin, "%d%d%d", &x, &y, &z);
        v[x].push_back(mp(y, z));
        v[y].push_back(mp(x, z));
    }
    dijkstra(1);
    for(int i=1; i<=k; i++)
        for(int j=1; j<=k; j++)
            for(int p=1; p<=n; p++)
                ans[i][j][p]=INF;
    for(int i=1; i<=k; i++){
        fscanf(fin, "%d", &t[i]);
        dijkstra(t[i]);
        ans[i][i][t[i]]=0;
    }
    fprintf(fout, "%d\n", solve(1, k, 1));
    fclose(fin);
    fclose(fout);
    return 0;
}