Pagini recente » Cod sursa (job #547758) | Cod sursa (job #1412202) | Cod sursa (job #571139) | Cod sursa (job #2250910) | Cod sursa (job #3268212)
#include <iostream>
#include <vector>
#include <fstream>
#include <queue>
#define Nmax 2005
#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>,vector<pair<int,int>>,greater<pair<int,int>>> pq;
bool viz[Nmax] = {0};
vector<int> distances(Nmax,inf);
distances[index[start]]=0;
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.second] && cost + next.first < distances[next.second])
{
distances[next.second] = cost + next.first;
pq.push(make_pair(distances[next.second],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;
}