Cod sursa(job #2444900)

Utilizator CharacterMeCharacter Me CharacterMe Data 1 august 2019 18:22:24
Problema Ubuntzei Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#define pii pair<int, int>
#define inf 2147483646/2
#define cost first
#define node second
using namespace std;
int n, m, i, j, k, nec[16], sol[32769][16], dist[2001][2001], q, out=inf;
vector<pii> graph[2001];
priority_queue<pii, vector<pii>, greater<pii> > pq;
void dijkstra(int start);
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", &nec[i]);
    for(i=1; i<=m; ++i){
        int x, y, z;
        scanf("%d%d%d", &x, &y, &z);
        graph[x].push_back({z, y});
        graph[y].push_back({z, x});
    }
    for(i=1; i<=(1<<k)-1; ++i)
        for(j=1; j<=k; ++j) sol[i][j]=inf;
    for(i=1; i<=k; ++i){
        for(j=1; j<=n; ++j) dist[nec[i]][j]=dist[j][nec[i]]=inf;
        dist[nec[i]][nec[i]]=0;
        pq.push({0, nec[i]});
        dijkstra(nec[i]);
        sol[1<<(i-1)][i]=dist[1][nec[i]];
    }
    for(i=1; i<=(1<<k)-1; ++i){
        int x=i, y; j=0;
        while(x){
            ++j;
            if(x%2==0) {x/=2; continue;}
            y=i; q=0;
            while(y){
                ++q;
                if(y%2==0) {y/=2; continue;} y/=2;
                if(q==j) continue;
                sol[i][q]=min(sol[i][q], sol[i^(1<<(q-1))][j]+dist[nec[q]][nec[j]]);
            }
            x/=2;
        }
    }
    for(i=1; i<=k; ++i) out=min(out, sol[(1<<k)-1][i]+dist[nec[i]][n]);
    printf("%d", out);
    return 0;
}
void dijkstra(int start){
    while(!pq.empty()){
        pii init=pq.top(), next; pq.pop();
        if(init.cost!=dist[start][init.node]) continue;
        for(auto j:graph[init.node]){
            next={init.cost+j.cost, j.node};
            if(next.cost<dist[start][next.node]){
                dist[start][next.node]=next.cost;
                dist[next.node][start]=next.cost;
                pq.push(next);
            }
        }
    }
    return;
}