Pagini recente » Cod sursa (job #700192) | Cod sursa (job #3170231) | Cod sursa (job #350127) | Cod sursa (job #109235) | Cod sursa (job #3192921)
#include <bits/stdc++.h>
#define INF 2000000000
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
int n,m,k,ubu[20],cost[2005][2005],dp[133000][20],sol=INF;
struct elem
{
int x,c;
bool operator < (const elem &a) const
{
return c>a.c;
}
};
vector<elem>a[2005];
priority_queue<elem>pq;
void dijkstra(int nod)
{
int i;
elem p;
for(i=1;i<=n;i++)
if(ubu[nod]!=i)cost[nod][i]=INF;
pq.push({ubu[nod],0});
while(!pq.empty())
{
p=pq.top();
pq.pop();
for(auto u:a[p.x])
if(cost[nod][u.x]>cost[nod][p.x]+u.c)
{
cost[nod][u.x]=cost[nod][p.x]+u.c;
pq.push({u.x,cost[nod][u.x]});
}
}
}
int main()
{
int i,j,stare,nod,x,y,z,p=1,vecin;
f>>n>>m>>k;
for(i=1;i<=k;i++)f>>ubu[i];
for(i=1;i<=m;i++)
{
f>>x>>y>>z;
a[x].push_back({y,z});
a[y].push_back({x,z});
}
ubu[0]=1;
ubu[k+1]=n;
for(i=0;i<=k+1;i++)
dijkstra(i);
for(i=0;i<=k+1;i++)p*=2;
p--;
for(stare=0;stare<=p;stare++)
for(nod=0;nod<=k+1;nod++)dp[stare][nod]=INF;
dp[1][0]=0;
for(stare=1;stare<p;stare++)
{
for(nod=0;nod<=k+1;nod++)
if(stare&(1<<nod))
if(dp[stare][nod]!=INF)
{
for(vecin=0;vecin<=k+1;vecin++)
if((stare&(1<<vecin))==0)
{
dp[stare|(1<<vecin)][vecin]=min(dp[stare|(1<<vecin)][vecin],dp[stare][nod]+cost[nod][ubu[vecin]]);
}
}
}
g<<dp[p][k+1];
return 0;
}