Pagini recente » Cod sursa (job #49704) | Cod sursa (job #383030) | Cod sursa (job #870205) | Cod sursa (job #2091115) | Cod sursa (job #3292255)
#include<bits/stdc++.h>
using namespace std;
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
int n,m,x,y,z,k;
int nr[2001];
vector<vector<int>>dp(70000,vector<int>(21,2e9));
vector<bool>parcurs;
vector<int>obl;
priority_queue<pair<int,int>>pq;
vector<vector<int>>distanta(2000,vector<int>(2000,2e9));
vector<vector<pair<int,int>>>muchii(2000);
int main()
{in>>n>>m;
in>>k;
obl.push_back(0);
for(int i=1;i<=k;i++)
{in>>x, obl.push_back(x-1);
nr[x]=i;}
k++;
for(int i=1;i<=m;i++)
{in>>x>>y>>z;
muchii[x-1].push_back(make_pair(y-1,z));
muchii[y-1].push_back(make_pair(x-1,z));
}
for(int i=0;i<n;i++)
distanta[i][i]=0;
for(int i=0;i<k;i++)
{pq.push(make_pair(0,obl[i]));
while(!pq.empty())
{int nod=pq.top().second;
pq.pop();
for(auto x:muchii[nod])
{int nod1=x.first,cost1=x.second;
if(distanta[obl[i]][nod1]>distanta[obl[i]][nod]+cost1)
{distanta[obl[i]][nod1]=distanta[obl[i]][nod]+cost1;
pq.push(make_pair(distanta[obl[i]][nod1],nod1));
}
}
}
}
dp[1][0]=0;
for(int mask=3;mask<(1<<k);mask+=2)
for(int i=1;i<k;i++)
if(mask&(1<<i))
for(auto x:muchii[obl[i]])
dp[mask][i]=min(dp[mask][i],dp[mask-(1<<i)][nr[x.first]]+x.second);
int rezultat=2e9;
for(int i=0;i<k;i++)
rezultat=min(rezultat,dp[(1<<k)-1][i]+distanta[obl[i]][n-1]);
out<<rezultat;
// out<<endl;
//for(int i=0;i<n;i++)
//{for(int j=0;j<n;j++)out<<distanta[i][j]<<" ";
//out<<endl;}
}