Cod sursa(job #2215409)

Utilizator mihai.alphamihai craciun mihai.alpha Data 21 iunie 2018 23:30:45
Problema Ubuntzei Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.97 kb
#include <bits/stdc++.h>

using namespace std;

const int maxn = 2005;
const int maxm = 10005;
const int maxconf = 5 + (1 << 16);

int n, m, k;
int c[20];
vector <pair <int, int> > v[maxn];
int dp[maxconf][16];
int q[maxn], st, dr;
int drum[maxn][maxn];
bool viz[maxn];

inline void belfor(int sursa)  {
    st = dr = 1;
    q[1] = sursa;
    memset(viz, 0, sizeof viz);
    memset(drum[sursa], 0x3f3f3f3f, sizeof drum[sursa]);
    drum[sursa][sursa] = 0;
        while(st <= dr)  {
        int nod = q[st];
        st++;
        viz[nod] = 1;
        for(auto x1 : v[nod])  {
            int x = x1.first;
            drum[sursa][x] = min(drum[sursa][x], drum[sursa][nod] + x1.second);
            if(!viz[x])  {
                q[++dr] = x;
            }
        }
    }
}

int main()  {
    freopen("ubuntzei.in", "r", stdin);
    freopen("ubuntzei.out", "w", stdout);
    scanf("%d%d%d", &n, &m, &k);
    for(int i = 1;i <= k;i++)  {
        scanf("%d", &c[i]);
    }
    for(int i = 1;i <= m;i++)  {
        int x, y, z;
        scanf("%d%d%d", &x, &y, &z);
        v[x].push_back({y, z});
        v[y].push_back({x, z});
    }
    belfor(1);
    for(int i = 1;i <= k;i++)  {
        belfor(c[i]);
    }
    memset(dp, 0x3f3f3f3f, sizeof dp);
    for(int i = 1;i <= k;i++)
        dp[1 << (i - 1)][i] = drum[1][c[i]];
    int CONF = 1 << (k);
    for(int conf = 1;conf < (CONF);conf++)
    for(int i = 1;i <= k;i++)  {
        if(conf & (1 << (i - 1)))  {
            for(int j = 1;j <= k;j++)  {
                if(i != j)
                if(conf & (1 << (j - 1)))  {
                    dp[conf][i] = min(dp[conf][i], dp[conf ^ (1 << (i - 1))][j] + drum[c[j]][c[i]]);
                }
            }
        }
    }
//    cerr << dp[CONF - 1][4];
    int ans = INT_MAX;
    for(int i = 1;i <= k;i++)  {
        ans = min(ans, dp[CONF - 1][i] + drum[c[i]][n]);
//        cerr << dp[CONF - 1][i];
    }
    cout << ans;
    return 0;
}