Pagini recente » Cod sursa (job #3040018) | Cod sursa (job #1899321) | Cod sursa (job #1285579) | Cod sursa (job #2615844) | Cod sursa (job #3281432)
#include <bits/stdc++.h>
#include <algorithm>
#define Nmax 2001
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
vector<vector<pair<int,int>>>graf(Nmax);
vector<int>tov;
priority_queue<pair<int,int>, vector<pair<int,int>>, greater<pair<int,int>> >q;
vector<vector<int>>cost(Nmax,vector<int>(Nmax,1e9));
bitset<Nmax>vis;
vector<vector<int>>dp(1<<15,vector<int>(20,1e9));
int n,m,k;
void dijkstra(int node, int index){
cost[index][node]=0;
q.push({0,node});
while(!q.empty()){
pair<int,int>smallest=q.top();
q.pop();
if(vis[smallest.second]==1)
continue;
vis[smallest.second]=1;
for(int i=0; i<(int)graf[smallest.second].size(); ++i){
int nxt=graf[smallest.second][i].first;
int val=graf[smallest.second][i].second;
if(smallest.first+val<cost[index][nxt]){
cost[index][nxt]=smallest.first+val;
q.push({cost[index][nxt],nxt});
}
}
}
}
void solve(){
for(int i=0; i<k; ++i)
dp[(1<<i)][i]=cost[0][tov[i+1]];
for(int msk=0; msk<(1<<k); ++msk){
for(int i=0; i<k; ++i){
if(msk&(1<<i)){
for(int j=0; j<k; ++j){
if((msk&(1<<j))==0){
int new_msk = msk^(1<<j);
dp[new_msk][j]=min(dp[new_msk][j],dp[msk][i]+cost[i+1][tov[j+1]]);
}
}
}
}
}
int ans=1e9;
for(int i=0; i<k; ++i)
ans=min(ans,dp[(1<<k)-1][i]+cost[i+1][n]);
g<<ans;
}
int main()
{
f>>n>>m>>k;
tov.resize(k+2);
for(int i=1; i<=k; ++i)
f>>tov[i];
for(int i=1; i<=m; ++i){
int x,y,c;
f>>x>>y>>c;
graf[x].push_back({y,c});
graf[y].push_back({x,c});
}
tov[0]=1;
tov[k+1]=n;
for(int i=0; i<=k+1; ++i){
vis.reset();
dijkstra(tov[i],i);
}
if(k==0)
g<<cost[0][n];
else solve();
return 0;
}