Cod sursa(job #903364)

Utilizator RengelBotocan Bogdan Rengel Data 1 martie 2013 20:14:51
Problema Ubuntzei Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.07 kb
#include <cstdio>
#include <climits>

#define nMax 2005
#define kMax 20
#define Inf INT_MAX

int N, M, K;
int A[nMax][nMax];
int C[kMax];

void Read(){

    scanf("%d %d\n", &N, &M);

    for(int i=1; i<=N; i++)
        for(int j=1; j<=N; j++)
            i-j ? A[i][j] = Inf : A[i][j] = 0;

    scanf("%d ", &K);
    for(int i=1; i<=K; i++)
        scanf("%d ", &C[i]);
    C[0] = 1;
    C[K+1] = N;

    int x, y, c;
    for(int i=1; i<=M; i++){
        scanf("%d %d %d\n", &x, &y, &c);
        A[x][y] = A[y][x] = c;
    }

}

bool S[nMax];
void Dijkstra(int Start){

    for(int i=1; i<=N; i++)
        S[i] = false;

    // A[Start][i] - Dijkstra (Start) -> [i]

    S[Start] = true;
    int nodMinim;
    int costMinim;
    for(int i=1; i<=N-1; i++){
        costMinim = Inf;
        for(int j=1; j<=N; j++)
            if(A[Start][j] < costMinim && !S[j]){
                nodMinim = j;
                costMinim = A[Start][j];
            }
        S[nodMinim] = true;
        for(int j=1; j<=N; j++)
            if(A[Start][j] > A[nodMinim][j] + costMinim && !S[j] && A[nodMinim][j] != Inf)
                A[Start][j] = A[nodMinim][j] + costMinim;
    }

}

int St[kMax];
int F[kMax];
int bestSum = Inf;
int Sum = 0;
void back(int k){

    for(int i=1; i<=K; i++){
        if(!F[i]){
            St[k] = i;
            F[i]++;
            Sum += A[C[St[k-1]]][C[St[k]]];
            if(Sum + A[C[St[k]]][C[St[k+1]]] < bestSum)   //if(valid(k))
                if(k==K)   //if(solutie)
                    bestSum = Sum + A[C[St[k]]][C[St[k+1]]];
                else back(k+1);
            F[i]--;
            Sum -= A[C[St[k-1]]][C[St[k]]];


        }
    }

}

int main(){

    freopen("ubuntzei.in", "r", stdin);
    freopen("ubuntzei.out", "w", stdout);

    Read();

    Dijkstra(1);
    for(int i=1; i<=K; i++)
        Dijkstra(C[i]);

    if(!K){
        printf("%d", A[1][N]);
        return 0;
    }
    St[0] = 0;
    St[K+1] = K+1;
    back(1);
    printf("%d", bestSum);

    return 0;

}