Cod sursa(job #2802559)

Utilizator AndreidreiGresoiu Liviu-Andrei Andreidrei Data 18 noiembrie 2021 12:57:46
Problema Ubuntzei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <bits/stdc++.h>
#define din cin
#define dout out
#define pi 3.14159265359
#define sw(x,y) x^=y,y^=x,x^=y
#define bmin(a,b)(((a)<(b))?(a):(b))
#define bmax(a,b)((a>b)?(a):(b))
#define ll long long
#define forq(i,ii,n)for(i=ii;i<n;i++)
using namespace std;
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
ll n,m,i,j,k,d[17][50001],c[17][50001],q,w[17],z,t[65536][16];vector<pair<ll,ll>>a[50001];map<ll,bool>b;
int main()
{
for(z=0;z<1<<16;z++)for(j=0;j<16;j++)t[z][j]=LLONG_MAX/4;
w[0]=1;
in>>n>>m>>q;w[q+1]=n,w[q]=1;
for(i=0;i<q;i++)in>>w[i];
while(m--)
    in>>i>>j>>k,a[i].push_back(make_pair(j,k)),a[j].push_back(make_pair(i,k));
for(z=0;z<=q;z++)
{
    fill(d[z],d[z]+50001,0);fill(c[z],c[z]+50001,LLONG_MAX/4);
    b[w[z]]=w[z],c[z][w[z]]=w[z];
while(b.empty()==0)
{
    k=b.begin()->first;
    b.erase(b.begin());
    //cout<<(k&USHRT_MAX)<<' '<<(k>>16)<<'\n';
    d[z][k&65535]=k>>16;
    k&=65535;
    for(auto i=a[k].begin();i!=a[k].end();++i)
        {
            j=(((long long)(i->second+d[z][k]))<<16)+i->first;
            if(j<c[z][i->first])
                b.erase(c[z][i->first]),c[z][i->first]=j,b[c[z][i->first]]=1;
        }
}
//for(i=1;i<=n;i++)cout<<d[z][i]<<' ';cout<<w[z]<<' '<<z<<' '<<q<<'\n';
}
for(z=0;z<q;z++)t[1<<z][z]=d[q][w[z]];
for(i=1;i<1<<q;i++)
    for(z=0;z<q;z++)
        if(t[i][z]!=LLONG_MAX/4)
{
    for(j=0;j<q;j++)if((i&(1<<j))==0)t[i|(1<<j)][j]=bmin(t[i|(1<<j)][j],t[i][z]+d[z][w[j]]);
}
j=LLONG_MAX/4,i=(1<<q)-1;
//cout<<t[1][0]<<' '<<d[0][4]<<'\n';
for(z=0;z<q;z++)j=bmin(j,t[i][z]+d[z][n]);
out<<(q?j:d[0][n]);
}