Pagini recente » Cod sursa (job #2480706) | Cod sursa (job #977513) | Cod sursa (job #1596904) | Cod sursa (job #74432) | Cod sursa (job #1902941)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
typedef pair<int,int> wow;
const int KMAX = 18;
const int NMAX = 2005;
const int INF = 0x3f3f3f3f;
int t,nodVecin,costMuchie,cDist,cNode,m,n,k,x,y,z;
int buddy[NMAX],dist[NMAX];
int dp[(1<<KMAX)][KMAX];
vector<wow> g[NMAX];
int cost[KMAX][KMAX];
void dijkstra(int cNode) {
memset(dist,INF,sizeof(dist));
dist[cNode]=0;
priority_queue<wow,vector<wow>,greater<wow> > Q;
Q.push(make_pair(0,cNode));
while(Q.size()) {
cDist=Q.top().first;
cNode=Q.top().second;
Q.pop();
if(cDist>dist[cNode]) continue;
for(auto q:g[cNode]) {
nodVecin = q.first;
costMuchie = q.second;
if(dist[nodVecin]>cDist+costMuchie) {
dist[nodVecin]=cDist+costMuchie;
Q.push(make_pair(dist[nodVecin],nodVecin));
}
}
}
}
int main()
{
fin>>n>>m>>k;
buddy[0]=1;
for(int i=1;i<=k;i++) {
fin>>buddy[i];
}
buddy[++k]=n;
for(int i=1;i<=m;i++) {
fin>>x>>y>>z;
g[x].push_back(make_pair(y,z));
g[y].push_back(make_pair(x,z));
}
for(int i=0;i<=k;i++) {
dijkstra(buddy[i]);
for(int j=0;j<=k;j++) {
cost[i][j]=dist[buddy[j]];
}
cost[i][i]=0;
}
memset(dp,INF,sizeof(dp));
dp[1][0]=0;
const int maxConf = (1<<(k+1));
for(int conf=1;conf<maxConf;conf++) {
for(int i=0;i<=k;i++) {
if(conf&(1<<i)) {
for(int j=0;j<=k;j++) {
if(conf&(1<<j)) {
dp[conf][i] = min(dp[conf][i],dp[(conf^(1<<i))][j]+cost[j][i]);
}
}
}
}
}
fout<<dp[maxConf-1][k]<<'\n';
fin.close();
fout.close();
return 0;
}