Cod sursa(job #2166337)
Utilizator | Data | 13 martie 2018 16:40:08 | |
---|---|---|---|
Problema | Ubuntzei | Scor | 40 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 3.85 kb |
#include<cstdio>
#include<queue>
#include<vector>
#include<cstring>
using namespace std;
int put2(int x)
{
int nr=1;
for(int i=1;i<=x;++i)
{
nr*=2;
}
return nr;
}
bool det(int x,int k)
{
for(int i=0;i<k;++i)
{
x-=(x%2);
x/=2;
}
return x%2;
}
typedef pair<int,int>ii;
typedef pair<int,ii>iii;
int city[16],pcity[16];
vector<ii>g[2001];
vector<ii>dist[2001];
priority_queue<iii,vector<iii>,greater<iii> >pq;
int main()
{
freopen("ubuntzei.in","r",stdin);
freopen("ubuntzei.out","w",stdout);
int n,m,k,i,x,y,z,minim=1000000000,j;
scanf("%d%d%d",&n,&m,&k);
for(i=1;i<=k;++i)
{
scanf("%d",&city[i]);
pcity[city[i]]=i;
}
for(i=1;i<=m;++i)
{
scanf("%d%d%d",&x,&y,&z);
g[x].push_back(ii(z,y));
g[y].push_back(ii(z,x));
}
dist[1].push_back(ii(0,0));
pq.push(iii(0,ii(1,0)));
int kk=1,sum=0;
for(i=0;i<k;++i)
{
sum+=kk;
kk*=2;
}
while(!pq.empty()&&pq.top().first<=minim)
{
iii top=pq.top();
pq.pop();
int d=top.first,val1=top.second.first,val2=top.second.second;
if(val1==n&&val2==sum)
{
if(minim>d)
minim=d;
continue;
}
int pozz;
for(j=0;j<dist[val1].size();++j)
{
if(dist[val1][j].second==val2)
{
pozz=j;
break;
}
}
if(d==dist[val1][pozz].first)
{
for(i=0;i<g[val1].size();++i)
{
int v=g[val1][i].second;
int dv=g[val1][i].first;
if(pcity[v])
{
if(!det(val2,pcity[v]-1))
{
int val3=val2+put2(pcity[v]-1);
int poz=-1;
for(j=0;j<dist[v].size();++j)
{
if(dist[v][j].second==val3)
{
poz=j;
break;
}
}
if(poz!=-1)
{
if(dist[v][poz].first>d+dv)
{
dist[v][poz].first=d+dv;
pq.push(iii(d+dv,ii(v,val3)));
}
}
else
{
dist[v].push_back(ii(d+dv,val3));
pq.push(iii(d+dv,ii(v,val3)));
}
}
}
else
{
int pozzz=-1;
for(j=0;j<dist[v].size();++j)
{
if(dist[v][j].second==val2)
{
pozzz=j;
break;
}
}
if(pozzz!=-1)
{
if(dist[v][pozzz].first>d+dv)
{
dist[v][pozzz].first=d+dv;
pq.push(iii(d+dv,ii(v,val2)));
}
}
else
{
dist[v].push_back(ii(d+dv,val2));
pq.push(iii(d+dv,ii(v,val2)));
}
}
}
}
}
for(i=0;i<dist[n].size();++i)
{
if(dist[n][i].second==sum)
{
printf("%d\n",dist[n][i].first);
break;
}
}
return 0;
}