Cod sursa(job #1296256)

Utilizator diana97Diana Ghinea diana97 Data 20 decembrie 2014 19:01:53
Problema Ubuntzei Scor 65
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.17 kb
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

ifstream f ("ubuntzei.in");
ofstream g ("ubuntzei.out");

const int NMAX = 2000 + 1;
const int KMAX = 15 + 1;
const int INF = 0x3fffffff;

int n, m, k;
int distanta[NMAX];
short int special[NMAX];
int distante[KMAX][KMAX + 2];
int best[1 << KMAX][NMAX];
vector < pair <int, int> > graf[NMAX];
queue <short int> Q;

void citeste() {
    f >> n >> m >> k;
    int a, b, c;
    for (int i = 1; i <= k; i++) f >> special[i];
    for (int i = 1; i <= m; i++) {
        f >> a >> b >> c;
        graf[a].push_back(make_pair(b, c));
        graf[b].push_back(make_pair(a, c));
    }
}

void bellman_ford(int sursa) {
    Q.push(sursa);
    int nod;
    for (int i = 1; i <= n; i++) distanta[i] = INF;
    distanta[sursa] = 0;

    while (!Q.empty()) {
        nod = Q.front();
        Q.pop();
        for (vector <pair <int ,int> > :: iterator it = graf[nod].begin(); it != graf[nod].end(); it++)
            if (distanta[(*it).first] > distanta[nod] + (*it).second) {
                distanta[(*it).first] = distanta[nod] + (*it).second;
                Q.push((*it).first);
            }
    }
}

void rezolva() {
    int nr_config = 1 << k, config2;
    if (!k) {
        bellman_ford(1);
        g << distanta[n];
        return;
    }

    special[0] = 1;
    for (int i = 0; i <= k; i++) {
        bellman_ford(special[i]);
        for (int j = 0; j <= k; j++)
            distante[i][j] = distanta[special[j]];
        distante[i][k + 1] = distanta[n];
    }

    for (int config = 0; config < nr_config; config++)
        for (int i = 0; i <= k; i++) best[config][i] = INF;

    best[0][0] = 0;
    for (int config = 1; config < nr_config; config++) {
        for (int i = 0; i < k; i++)
            if (config & (1 << i)) {
                config2 = config - (1 << i);
                for (int j = 0; j <= k; j++)
                    best[config][i + 1] = min(best[config][i + 1], best[config2][j] + distante[j][i + 1]);
            }
    }

    int sol = INF;
    for (int i = 1; i <= k; i++)
        sol = min(sol, best[nr_config - 1][i] + distante[i][k + 1]);
    g << sol << '\n';
}

int main() {
    citeste();
    rezolva();
    return 0;
}