Pagini recente » Cod sursa (job #1290439) | Cod sursa (job #17869) | Cod sursa (job #2777262) | Cod sursa (job #1692290) | Cod sursa (job #3268220)
#include <bits/stdc++.h>
#define Nmax 20005
#define inf 1e9
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
bool is_key[Nmax];
vector<pair<int,int>> g[Nmax];
int dp[(1<<20)][20];
int dist[20][20];
int idx[20];
int set_index[Nmax];
int n,m,k;
void dijkstra(int i)
{
priority_queue<pair<int,int>> pq;
pq.push({0,idx[i]});
bitset <Nmax>viz;
while(!pq.empty())
{
pair<int,int> urm=pq.top();
pq.pop();
if(viz[urm.second]) continue;
viz[urm.second]=1;
if(is_key[urm.second])
{
dist[i][set_index[urm.second]]=-urm.first;
}
for(pair<int,int> u:g[urm.second])
{
if(!viz[u.first])
{
pq.push({urm.first-u.second,u.first});
}
}
}
}
int main()
{
fin>>n>>m>>k;
idx[0]=1;
idx[k+1]=n;
set_index[1]=0;
set_index[n]=k+1;
is_key[1]=1;
is_key[n]=1;
for(int i=1;i<=k;i++)
{
fin>>idx[i];
set_index[idx[i]]=i;
is_key[idx[i]]=1;
}
for(int i=1;i<=m;i++)
{
int x,y,c;
fin>>x>>y>>c;
g[x].push_back(make_pair(y,c));
g[y].push_back(make_pair(x,c));
}
for(int i=0;i<=k+1;i++)
dijkstra(i);
k++;
for(int conf = 0 ; conf < (1<<k) ; conf++)
{
for(int i=0 ; i<k ; i++)
{
dp[conf][i+1] = inf;
if(conf & (1<<i))
{
int oldconf = conf ^ (1<<i);
if(oldconf == 0)
dp[conf][i+1] = dist[0][i+1];
else
{
for(int j=0 ; j<k ; j++)
{
dp[conf][i+1] = min(dp[conf][i+1],dp[oldconf][j+1] + dist[j+1][i+1]);
}
}
}
}
}
fout<<dp[(1<<k)-1][k];
return 0;
}