Cod sursa(job #2071938)

Utilizator mihai.alphamihai craciun mihai.alpha Data 21 noiembrie 2017 10:37:45
Problema Ubuntzei Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.93 kb
#include <bits/stdc++.h>

using namespace std;

struct at  {
    int fi, se;
    bool operator < (const at &a) const  {
        return se > a.se;
    }
};


const int maxn = 2e4 + 5;
const int inf = 1e9;

int N, M, K;
int v[20];
vector <at> g[maxn];
int d[maxn][maxn];
priority_queue <at> q;

inline void dijkstra(int sursa)  {
    q.push({sursa, 0});
    for(int i = 1;i <= N;i++)
        d[sursa][i] = inf;
    while(!q.empty())  {
        at nod = q.top();
        q.pop();
        if(d[sursa][nod.fi] == inf)  {
            d[sursa][nod.fi] = nod.se;
            for(auto &x : g[nod.fi])  {
                if(d[sursa][x.fi] == inf)  {
                    q.push({x.fi, x.se + nod.se});
                }
            }
        }
    }
}

int dp[20][20];

inline void hamilton()  {

}

int main()  {
    freopen("ubuntzei.in", "r", stdin);
    freopen("ubuntzei.out", "w", stdout);
    cin >> N >> M >> K;
    for(int i = 0;i < K;i++)
        cin >> v[i];
    for(int i = 1;i <= M;i++)  {
        int x, y, z;
        cin >> x >> y >> z;
        g[x].push_back({y, z});
        g[y].push_back({x, z});
    }
    dijkstra(1);
    if(K == 0)  {
        cout << d[1][N];
        return 0;
    }
    for(int i = 0;i < K;i++)  {
        dijkstra(v[i]);
    }
    for(int i = 1;i < (1 << K);i++)
        for(int j = 0;j < K;j++)
            dp[i][j] = inf;
    for(int i = 0;i < K;i++)
        dp[(1 << i)][i] = d[1][v[i]];
    for(int i = 1;i < (1 << K);i++)  {
        for(int j = 0;j < K;j++) if(i & (1 << j))  {
            for(int l = 0;l < K;l++)  {
                if(j != l)  {
                    if(i & (1 << l))
                        dp[i][j] = min(dp[i][j], dp[i ^ (1 << j)][l] + d[v[l]][v[j]]);
                }
            }
        }
    }
    int ans = inf;
    for(int i = 0;i < K;i++)
        ans = min(ans, dp[(1 << K) - 1][i] + d[v[i]][N]);
    cout << ans;
    return 0;
}