Cod sursa(job #1623589)

Utilizator Sanduleac_VladSanduleac Vllad Alexandru Sanduleac_Vlad Data 1 martie 2016 20:29:43
Problema Ubuntzei Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.34 kb
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;

struct L {
    int pos;
    int ccrt;
    bool operator<(const L &other) const {
        return ccrt > other.ccrt;
    }
    L(int _pos, int _ccrt) {
        pos = _pos;
        ccrt = _ccrt;
    }
    L() {}
};

int N, M;
int K;
int pos[16];
int d[20][20];
vector<int> viz;
vector<vector<pair<int, int> > > con;
priority_queue<L> q;

void bfs(int start, int as) {
    int i;
    fill(viz.begin(), viz.end(), 0);
    q.push(L(start, 1));
    while(!q.empty()) {
        L tmp, crt;
        crt = q.top();
        q.pop();
        if(viz[crt.pos] == 0) {
            viz[crt.pos] = crt.ccrt;
        } else {
            continue;
        }
        for(i = 0; i < con[crt.pos].size(); i++) {
            if(viz[con[crt.pos][i].first] == 0) {
                tmp = crt;
                tmp.pos = con[crt.pos][i].first;
                tmp.ccrt += con[crt.pos][i].second;
                q.push(tmp);
            }
        }
    }
    d[as][0] = viz[0] - 1;
    for(i = 1; i <= K; i++) {
        d[as][i] = viz[pos[i]] - 1;
    }
    d[as][K + 1] = viz[N - 1] - 1;
}

int viz2[20][70001];

void dfs(int pos, int stare) {
    int i;
    for(i = 1; i <= K + 1; i++) {
        if(i == K + 1 && stare == (1 << K) - 1) {
            viz2[i][stare] = viz2[pos][stare] + d[pos][i];
        } else if(i <= K && !(stare & (1 << (i - 1))) && (viz2[i][stare | (1 << (i - 1))] == 0 || viz2[i][stare | (1 << (i - 1))] == 0 > viz2[pos][stare] + d[pos][i])) {
            int starenoua;
            starenoua = stare | (1 << (i - 1));
            viz2[i][starenoua] = viz2[pos][stare] + d[pos][i];
            dfs(i, starenoua);
        }
    }
}

int main() {
    int i, j;
    freopen("ubuntzei.in", "r", stdin);
    freopen("ubuntzei.out", "w", stdout);
    scanf("%d %d", &N, &M);
    scanf("%d", &K);
    for(i = 1; i <= K; i++) {
        scanf("%d", &pos[i]);
        pos[i]--;
    }
    con.resize(N, vector<pair<int, int> >());
    for(i = 1; i <= M; i++) {
        int a, b, c;
        scanf("%d %d %d", &a, &b, &c);
        a--;
        b--;
        con[a].push_back(make_pair(b, c));
        con[b].push_back(make_pair(a, c));
    }
    viz.resize(N, 0);
    bfs(0, 0);
    bfs(N -1, K + 1);
    for(i = 1; i <= K; i++) {
        bfs(pos[i], i);
    }
    dfs(0, 0);
    printf("%d\n", viz2[K + 1][(1 << K - 1)]);
    return 0;
}