Cod sursa(job #2321481)

Utilizator PredaBossPreda Andrei PredaBoss Data 16 ianuarie 2019 09:40:39
Problema Ubuntzei Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <bits/stdc++.h>
#define piii pair<pair<int,short>,short>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
vector<pair<short,int> >nod[2005];
int n,m,k,x,y,c;
short pretin[20];
short val[2005];
bitset<32800>ap[2005],el[15];
priority_queue<piii,vector<piii >,greater<piii > >pq;
void bkk(int pos,int v,int last)
{
    ap[pos][v]=1;
    for(int i=last-1;~i;i--)
    {
        if((v&(1<<i))!=0 && ap[pos][v-(1<<i)]==0)
        {
            v-=(1<<i);
            bkk(pos,v,i);
            v+=(1<<i);
        }
    }
}
int main()
{
    fin>>n>>m>>k;
    memset(val,-1,sizeof val);
    for(int i=0;i<k;i++)
    {
        fin>>pretin[i];
        val[pretin[i]]=i;
    }
    for(int i=1;i<=m;i++)
    {
        fin>>x>>y>>c;
        nod[x].push_back({y,c});
        nod[y].push_back({x,c});
    }
    pq.push({{0,0},1});
    while(!pq.empty())
    {
        int cst=pq.top().first.first;
        short v=-pq.top().first.second;
        short pos=pq.top().second;
        pq.pop();
        if(ap[pos][v]) continue;
        bkk(pos,v,k);
        if(pos==n && (1<<k)-1==v)
        {
            fout<<cst;
            return 0;
        }
        for(int i=0;i<nod[pos].size();i++)
        {
            int counter=v;
            if(val[nod[pos][i].first]!=-1)
            {
                if((counter&(1<<val[nod[pos][i].first]))!=0) continue;
                counter+=(1<<val[nod[pos][i].first]);
            }
            if(ap[nod[pos][i].first][counter]) continue;
            pq.push({{nod[pos][i].second+cst,-counter},nod[pos][i].first});
        }
    }
    return 0;
}