Pagini recente » Cod sursa (job #534930) | Cod sursa (job #260731) | Cod sursa (job #1826775) | Cod sursa (job #1982749) | Cod sursa (job #2789769)
#include<bits/stdc++.h>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
vector<pair<int,int>>v[2001];
int d[18][2001];
vector<int>ub;
int main()
{
priority_queue<pair<long long,long long>,vector<pair<long long,long long>>,greater<pair<long long,long long>>>pq;
long long n,m,k;
fin>>n>>m>>k;
for(long long i=1;i<=k;i++)
{
long long x;
fin>>x;
ub.push_back(x);
for(int j=1;j<=n;j++)
d[i][j]=2e9+1;
}
ub.push_back(1);
ub.push_back(n);
k+=2;
for(int j=1;j<=n;j++)
d[k-1][j]=2e9+1;
for(int j=1;j<=n;j++)
d[k][j]=2e9+1;
for(long long i=1;i<=m;i++)
{
long long a,b,c;
fin>>a>>b>>c;
v[a].push_back({c,b});
v[b].push_back({c,a});
}
for(long long i=1;i<=k;i++)
{
pq.push({0,ub[i-1]});
d[i][ub[i-1]]=0;
while(!pq.empty())
{
pair<long long,long long> nod=pq.top();
//cout<<nod.first<<" "<<nod.second<<": ";
pq.pop();
if(nod.first!=d[i][nod.second])
continue;
for(auto q:v[nod.second])
{
if(d[i][nod.second]+q.first<d[i][q.second])
{
d[i][q.second]=d[i][nod.second]+q.first;
pq.push({d[i][q.second],q.second});
//cout<<d[i][q.second]<<" "<<q.second<<" ";
}
}
//cout<<endl;
}
}
long long dmin=1e18;
k-=2;
if(k==0)
{
fout<<d[1][n];
return 0;
}
for(int i=0;i<(1<<k);i++)
{
int ci=i;
vector<int>ord;
for(int j=0;j<k;j++)
{
if(ci%2==1)
ord.push_back(ub[j]);
ci/=2;
}
if(ord.size()==k)
{
long long dd=0;
dd+=d[k+1][ub[0]];
for(int j=1;j<k;j++)
dd+=d[j][ub[j]];
dd+=d[k+2][ub[k-1]];
dmin=min(dmin,dd);
}
}
fout<<dmin;
}