Pagini recente » Cod sursa (job #2263102) | Cod sursa (job #1512367) | Cod sursa (job #376366) | Cod sursa (job #1786725) | Cod sursa (job #3292617)
#include<bits/stdc++.h>
using namespace std;
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
int n,m,x,y,z,k;
int inf=2e9;
int nr[2001];
vector<vector<int>>dp(70000,vector<int>(21,inf));
vector<bool>parcurs;
vector<int>obl;
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>pq;
vector<vector<int>>distanta(2000,vector<int>(2000,inf));
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-1]=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));
}
}
}
}
vector<vector<pair<int,int>>>drum(k,vector<pair<int,int>>(0));
for(int i=0;i<k;i++)
for(int j=0;j<k;j++)
if(i!=j&&distanta[obl[i]][obl[j]]!=inf)
drum[i].push_back(make_pair(j,distanta[obl[i]][obl[j]]));
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:drum[i])
dp[mask][i]=min(dp[mask][i],dp[mask^(1<<i)][x.first]+x.second);
int rezultat=inf;
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;}
}