Pagini recente » Cod sursa (job #861516) | Cod sursa (job #2778815) | Cod sursa (job #3135689) | Cod sursa (job #1142422) | Cod sursa (job #2559579)
#include <bits/stdc++.h>
using namespace std;
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
int n,m,k,x,y,ok[2005],cost,d[2005][16],ebit;
vector<pair<int,int>> v[2005];
struct lmao
{
int nod,cate,cost;
bool operator<(const lmao &aux) const
{
if(cost!=aux.cost) return cost>aux.cost;
else return cate<aux.cate;
}
};
priority_queue<lmao> q;
lmao z;
void dijkstra(int nod)
{
for(int i=1;i<=n;i++)
for(int j=0;j<=k;j++)
d[i][j]=1e9;
if(ok[1]==0) {
q.push({1,0,0});
d[1][0]=0;
}
else
{
q.push({1,(1<<ok[1]),0});
d[1][1]=0;
}
while(!q.empty())
{
z=q.top();
q.pop();
for(auto it:v[z.nod])
{
int nrb=__builtin_popcount(z.cate);
if(ok[it.second]!=0)
{
ebit=(z.cate & (1 << (ok[it.second] - 1)));
if(!ebit)
{
if(d[it.second][nrb+1]>d[z.nod][nrb]+it.first)
{
d[it.second][nrb+1]=d[z.nod][nrb]+it.first;
q.push({it.second,(z.cate|(1<<(ok[it.second]-1))),d[it.second][nrb+1]});
}
}
else
{
if(d[it.second][nrb]>d[z.nod][nrb]+it.first)
{
d[it.second][nrb]=d[z.nod][nrb]+it.first;
q.push({it.second,z.cate,d[it.second][nrb]});
}
}
}
else
{
if(d[it.second][nrb]>d[z.nod][nrb]+it.first)
{
d[it.second][nrb]=d[z.nod][nrb]+it.first;
q.push({it.second,z.cate,d[it.second][nrb]});
}
}
}
}
}
int main()
{
in>>n>>m;
in>>k;
for(int i=1;i<=k;i++)
{
in>>x;
ok[x]=i;
}
for(int i=1;i<=m;i++)
{
in>>x>>y>>cost;
v[x].push_back({cost,y});
v[y].push_back({cost,x});
}
dijkstra(1);
//(int i=0;i<=k;i++) cout<<d[n][i]<<" ";
out<<d[n][k];
return 0;
}