Cod sursa(job #2815925)

Utilizator alextheseal1240Alex Vladu alextheseal1240 Data 10 decembrie 2021 16:58:40
Problema Ubuntzei Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.95 kb
#define inf 0x3f3f3f3f
#include <fstream>
#include <queue>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
vector<vector<pair<int, int>>>g(2001);
int n, m, k;
int dist[18][2001];
int f[18], fl;
int dp[(1<<18)], lastadd[(1<<18)];
void dijkstra(int varf, int id)
{
    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>>q;
    vector<int>d(2001, inf);
    q.push({0, varf}), d[varf]=0;
    while(!q.empty())
    {
        int cost=q.top().first;
        int nod=q.top().second;
        q.pop();
        if(d[nod]<cost)
            continue;
        for(auto val:g[nod])
            if(d[val.first]>d[nod]+val.second)
                d[val.first]=d[nod]+val.second, q.push({d[val.first], val.first});
    }
    for(int i=1; i<=n; i++)
        dist[id][i]=d[i];
}
void read()
{
    fin >> n >> m >> k;
    f[0]=1;
    for(int i=2; i<=k+1; i++)
        fin >> f[++fl];
    f[++fl]=n;
    fl++;
    for(int i=1, a, b, c; i<=m; i++)
        fin >> a >> b >> c, g[a].push_back({b, c}), g[b].push_back({a, c});
    for(int i=0; i<fl; i++)
        dijkstra(f[i], i);
}
int bktrez[25], pa;
void attr(int mask)
{
    for(int j=0; j<fl; j++)
    {
        if(!(mask&(1<<j)))
        {
            int ind=lastadd[mask];
            if(dp[mask|(1<<j)]>dp[mask]+dist[j][f[ind]])
                dp[mask|(1<<j)]=dp[mask]+dist[j][f[ind]], lastadd[mask|(1<<j)]=ind;
        }
    }
}
void bkt(int k, int nr=0)
{
    for(int i=bktrez[k-1]+1; i<(fl-pa+k); i++)
    {
        bktrez[k]=i;
        if(k<pa)
            bkt(k+1, nr+(1<<i));
        else
            attr(nr+(1<<i));
    }
}
void solve()
{
    for(int i=0; i<(1<<fl); i++)
        dp[i]=inf;
    for(int j=0; j<fl; j++)
        dp[1<<j]=0, lastadd[1<<j]=j;
    for(int i=2; i<=fl; i++)
        bktrez[0]=-1, pa=i-1, bkt(1);
    fout << dp[(1<<fl)-1];
}
int main()
{
    read();
    solve();
    return 0;
}