Cod sursa(job #883698)

Utilizator swim406Teudan Adina swim406 Data 20 februarie 2013 11:48:19
Problema Ubuntzei Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <stdio.h>
#include<limits.h>
#include<algorithm>
 
using namespace std;
 
int N, M, K, i, loc[2001], a[2001][2001], x, y, k, j, z, V[2001], minn = INT_MAX, L;
 
int main() {
    freopen ("ubuntzei.in", "r", stdin);
    freopen ("ubuntzei.out", "w", stdout);
    scanf ("%d %d %d", &N, &M, &K);
    for (i = 1; i <= K; ++i)
        scanf ("%d", &loc[i]);
    for (i = 1; i <= M; ++i) {
        scanf ("%d %d %d", &x, &y, &z);
        a[x][y] = z;
        a[y][x] = z;
    }
    for (k = 1; k <= N; k++)
        for (i = 1; i <= N; i++)
            for (j = 1; j <= N; j++)
                if (a[i][k] && a[k][j] && (a[i][j] > a[i][k] + a[k][j] || !a[i][j]) && i != j)
                    a[i][j] = a[i][k] + a[k][j];
    for (i = 1; i <= K; i++)
        V[i] = i;
    do {
        L = a[1][loc[V[1]]];
        if (L < minn) {
            for (int i = 2; i <= K; i++) {
                L += a[loc[V[i-1]]][loc[V[i]]];
                if (L >= minn) i = K + 1;
            }
            if (L < minn)
                L += a[loc[V[K]]][N];
        }
        if (L < minn)
            minn = L;
    } while (next_permutation ( V + 1, V + K + 1));
    printf("%d", minn);
    return 0;
}