Cod sursa(job #1482825)

Utilizator tudoras8tudoras8 tudoras8 Data 7 septembrie 2015 23:23:02
Problema Ubuntzei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>

#define pb push_back

using namespace std;

const int MAXN = 201;
const int MAXK = 16;

int n, m, k;

int d[MAXN][MAXN] = {};
int adj[MAXN][MAXN] = {};

int main()
{
    ifstream cin("ubuntzei.in");
    ofstream cout("ubuntzei.out");

    cin >> n >> m >> k;

    // initializare
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= n; ++j) {
            d[i][j] = 0;
            adj[i][j] = 0;
        }
    }

    vector<int> c(k + 1);
    for (int i = 1; i <= k; ++i) {
        cin >> c[i];
    }
    for (int i = 1; i <= m; ++i) {
        int x, y, z;
        cin >> x >> y >> z;

        d[x][y] = d[y][x] = z;
        adj[x][y] = adj[y][x] = 1;
    }
    for (int t = 1; t <= n; ++t) {
        for (int i = 1; i <= n; ++i) {
            for (int j = 1; j <= n; ++j) {
                if (d[i][t] && d[t][j]) {
                    d[i][j] = min(d[i][j], d[i][t] + d[t][j]);
                }
            }
        }
    }

    uint64_t minlen = ~0;
    uint64_t perm[MAXK];

    for (int i = 1; i <= k; ++i) {
        perm[i] = i;
    }

    do {
        uint64_t len = 0;
        len += d[1][c[perm[1]]];
        for (int i = 1; i <= k - 1; ++i) {
            len += d[c[perm[i]]][c[perm[i + 1]]];
        }
        len += d[c[perm[k]]][n];
        minlen = min(minlen, len);
    } while (next_permutation(perm + 1, perm + 1 + k));

    cout << minlen;

    return 0;
}