Pagini recente » Cod sursa (job #1049286) | Cod sursa (job #2036004) | Cod sursa (job #745174) | Cod sursa (job #859223) | Cod sursa (job #2025077)
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
struct edge
{
int nod,cost;
bool operator <(const edge &aux) const
{
return cost>aux.cost;
}
};
vector<edge> v[2010];
priority_queue<edge> q;
int d[2010],cost[2010][2010],v1[20],n,dp[32770][15];
void solve(int nod)
{
for(int i=1;i<=n;i++) d[i]=2e9;
q.push({nod,0});
while(!q.empty())
{
int nod=q.top().nod,cost=q.top().cost;
q.pop();
if(d[nod]<cost) continue;
for(int i=0;i<v[nod].size();i++)
{
int vec=v[nod][i].nod,c=v[nod][i].cost;
if(d[vec]<=cost+c) continue;
d[vec]=cost+c;
q.push({vec,d[vec]});
}
}
for(int i=1;i<=n;i++) cost[nod][i]=cost[i][nod]=d[i];
}
int main()
{
freopen("ubuntzei.in","r",stdin);
freopen("ubuntzei.out","w",stdout);
int m,k,x,y,c;
scanf("%d%d%d",&n,&m,&k);
for(int i=0;i<k;i++) scanf("%d",&v1[i]);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&c);
v[x].push_back({y,c});
v[y].push_back({x,c});
}
for(int i=0;i<k;i++) solve(v1[i]);
solve(1);
if(k==0) {printf("%d",cost[1][n]);return 0;}
for(int mask=1;mask<(1<<k);mask++)
for(int i=0;i<k;i++)
dp[mask][i]=2e9;
for(int i=0;i<k;i++) dp[(1<<i)][i]=cost[1][v1[i]];
for(int mask=1;mask<(1<<k)-1;mask++)
for(int i=0;i<k;i++)
{
int nod=v1[i];
if(mask&(1<<i)) continue;
for(int j=0;j<k;j++)
{
if(mask&(1<<j)==0) continue;
int nod1=v1[j];
dp[mask+(1<<j)][i]=min(dp[mask+(1<<j)][i],dp[mask][j]+cost[nod][nod1]);
}
}
int sol=2e9;
for(int i=0;i<k;i++)
sol=min(sol,dp[(1<<k)-1][i]+cost[v1[i]][n]);
printf("%d",sol);
return 0;
}