Pagini recente » Cod sursa (job #1943174) | Cod sursa (job #10729) | Cod sursa (job #441870) | Cod sursa (job #1887197) | Cod sursa (job #3268216)
#include <iostream>
#include <vector>
#include <fstream>
#include <queue>
#define Nmax 20005
#define Mmax 10005
#define inf 1e18
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
bool is_key[Nmax];
vector<pair<int,int>> g[Mmax];
int dp[(1<<20)][20];
int dist[20][20];
int index[20];
int set_index[Nmax];
int n,m,k;
void dijkstra(int start)
{
priority_queue<pair<int,int>> pq;
bool viz[Nmax] = {0};
vector<int> distances(Nmax,inf);
pq.push(make_pair(0,index[start]));
while(!pq.empty())
{
int node = pq.top().second;
int cost = pq.top().first;
pq.pop();
if(viz[node])
continue;
viz[node]=1;
if(is_key[node])
{
dist[start][set_index[node]]= -cost;
}
for(auto next : g[node])
{
if(!viz[next.first])
{
pq.push(make_pair(cost-next.first,next.second));
}
}
}
}
int main()
{
fin>>n>>m>>k;
index[0]=1;
index[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>>index[i];
set_index[index[i]]=i;
is_key[index[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;
}