Pagini recente » Cod sursa (job #2562050) | Cod sursa (job #3154497) | Cod sursa (job #2194917) | Cod sursa (job #2550524) | Cod sursa (job #2710325)
#include <bits/stdc++.h>
#define NMAX 2002
#define KMAX 18
#define INF 1e9
using namespace std;
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
vector <pair <int,int> >adj[NMAX];
vector<int>ub;
int d[KMAX][KMAX],ruta[NMAX],distante[NMAX];
int dp[KMAX][1<<KMAX];
int n,m,k,rez=INF;
void dijkstra(int ind)
{
for(int i=1;i<=n;i++)
distante[i]=INF;
priority_queue < pair <int, int> >pq;
distante[ub[ind]]=0;
pq.push({0,ub[ind]});
while(!pq.empty())
{
pair<int, int>u=pq.top();
pq.pop();
for(vector < pair <int, int> >::iterator it=adj[u.second].begin();it!=adj[u.second].end();it++)
{
pair <int, int> v=*it;
if(distante[v.second]>distante[u.second]+v.first)
{
distante[v.second]=distante[u.second]+v.first;
pq.push({-distante[v.second],v.second});
}
}
}
}
int main()
{
in>>n>>m>>k;
ub.push_back(1);
ruta[1]=0;
for(int i=1;i<=k;i++){
int nr;
in>>nr;
ruta[nr]=i;
ub.push_back(nr);
}
ub.push_back(n);
ruta[n]=k+1;
for(int i=1;i<=m;i++)
{
int a,b,cost;
in>>a>>b>>cost;
adj[a].push_back({cost,b});
adj[b].push_back({cost,a});
}
for(int i=0;i<=k+1;i++)
for(int j=0;j<=k+1;j++)
d[i][j]=INF;
for(int i=0;i<=k+1;i++)
{
dijkstra(i);
for(int j=0;j<=k+1;j++)
d[i][j]=d[j][i]=distante[ub[j]];
}
int mask_max=((1 << (k+2))-1);
for(int i=0;i<=k+1;i++)
for(int mask=1;mask<=mask_max;mask++)
dp[i][mask]=INF;
dp[0][1]=0;
for(int i=0;i<=k+1;i++)
for(int mask=1;mask<=mask_max;mask++)
if((mask & (1 << i))!=0)
for(int j=0;j<=k+1;j++)
if((mask & (1 << j))==0)
dp[j][mask+(1 << j)]=min(dp[i][mask]+d[i][j],dp[j][mask+(1 << j)]);
rez=dp[k+1][mask_max];
if(k==0)
out<<d[0][k+1];
else
out<<rez;
return 0;
}