Pagini recente » Cod sursa (job #2004996) | Cod sursa (job #1360745) | Cod sursa (job #2528981) | Cod sursa (job #2112755) | Cod sursa (job #1515935)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
class cmp{
public:
bool operator() (pair<int, int> a,pair<int, int> b){
return a.second>b.second;
}
};
const int KMAX = 17, MAX = 2001, INF = (1<<30);
int n, m, k, dp[1<<KMAX][KMAX], id[MAX], pr[KMAX], cost[KMAX][KMAX], d[MAX];
vector <pair <int, int> > la[MAX];
priority_queue <pair<int, int>, vector<pair<int, int> >, cmp> q;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
void dijkstra(int nod){
for(int i=1; i<=n; i++) d[i] = INF;
d[nod] = 0;
q.push({nod, 0});
while(!q.empty()){
int u = q.top().first;
int dst = q.top().second;
q.pop();
if(d[u]<dst) continue;
for(unsigned i=0; i<la[u].size(); i++){
int v = la[u][i].first;
int w = la[u][i].second;
if(d[u]+w<d[v]){
d[v] = d[u] + w;
q.push({v, d[v]});
}
}
}
for(int i=0; i<=k+1; i++)
cost[id[nod]][ id[ pr[i] ] ] = d[ pr[i] ];
}
int hamilton(){
int lim = 1<<(k+2);
for(int i=0; i<lim; i++)
for(int j=0; j<k+2; j++)
dp[i][j] = INF;
dp[1][0] = 0;
for(int i=0; i<lim; i++)
for(int v=0; v<k+2; v++)
if(i&(1<<v))
for(int u=0; u<k+2; u++)
if(i&(1<<u))
if(dp[i][v]>dp[ i^(1<<v) ][u] + cost[u][v])
dp[i][v] = dp[ i^(1<<v) ][u] + cost[u][v];
return dp[lim-1][k+1];
}
int main()
{
fin>>n>>m>>k;
for(int i=1; i<=k; i++){
fin>>pr[i];
id[pr[i]] = i;
}
pr[0] = 1; pr[k+1] = n; id[n] = k+1;
for(int i=1; i<=m; i++){
int u, v, w;
fin>>u>>v>>w;
la[u].push_back({v, w});
la[v].push_back({u, w});
}
for(int i=0; i<=k+1; i++)
dijkstra(pr[i]);
fout<<hamilton();
return 0;
}