Pagini recente » Cod sursa (job #1885563) | Cod sursa (job #827620) | Cod sursa (job #1602050) | Cod sursa (job #1566537) | Cod sursa (job #2952178)
#include<bits/stdc++.h>
#define int long long
#define INF 1000000000000000000
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
vector< pair<int,int> >v[2005];
priority_queue< pair<int,int> >pq;
int w[2000],dp[20][1<<18],p[18],fv[2004],poz[2004],n,k,dist[20][2005];
void dijkstram(int nod)
{
int i;
pq.push({w[nod],0});
for(i=1;i<=n;i++)
dist[nod][i]=INF;
dist[nod][w[nod]]=0;
while(!pq.empty())
{
int nod1=pq.top().first;
int cost=pq.top().second;
pq.pop();
for(auto it:v[nod1])
{
if(dist[nod][it.first]>dist[nod][nod1]+it.second)
{
dist[nod][it.first]=dist[nod][nod1]+it.second;
pq.push({it.first,dist[nod][it.first]});
}
}
}
}
signed main()
{
int i,m,x,y,z,ok,j,mask;
f>>n>>m;
f>>k;
w[0]=1;
w[k+1]=n;
for(i=1;i<=k;i++)
f>>w[i],fv[w[i]]++,poz[w[i]]=i;
for(i=1;i<=m;i++)
{
f>>x>>y>>z;
v[x].push_back({y,z});
v[y].push_back({x,z});
}
p[0]=1;
for(i=1;i<=18;i++)
p[i]=p[i-1]*2;
for(i=0;i<=k+1;i++)
dijkstram(i);
for(mask=0;mask<=p[k+2]-1;mask++)
for(i=0;i<=k+1;i++)
dp[i][mask]=INF;
dp[0][1]=0;
for(mask=1;mask<=p[k+2]-1;mask++)
{
for(i=0;i<=k+1;i++)
{
if((mask&p[i])!=0)
{
if(dp[i][mask]!=INF)
{
for(j=0;j<=k+1;j++)
{
if((mask&p[j])==0)
dp[j][mask|p[j]]=min(dp[j][mask|p[j]],dp[i][mask]+dist[i][w[j]]);
}
}
}
}
}
g<<dp[k+1][p[k+2]-1];
return 0;
}