Pagini recente » Cod sursa (job #394972) | Cod sursa (job #2850988) | Cod sursa (job #1147926) | Cod sursa (job #376382) | Cod sursa (job #2868042)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
const int nmax = 2e2 + 1;
const int smax = (2<<15) + 1;
const int inf = 1e9;
int N,M;
int K;
vector<int> C;
vector<pair<int,int>>ADJ[nmax];
int DP[smax][nmax];
int F[nmax];
struct inHeap{
int mask,nod,dist;
bool operator<(const inHeap aux) const{
return aux.dist<dist;
}
};
priority_queue<inHeap>Q;
void update(int mask,int nod,int dist){
if(dist<DP[mask][nod]){
DP[mask][nod]=dist;
Q.push({mask,nod,dist});
}
}
int Dijkstra(){
for(int i=0;i<=(2<<K);i++)
for(int j=1;j<=N;j++)
DP[i][j]=inf;
Q.push({0,1,0});
DP[0][1]=0;
while(!Q.empty()){
inHeap x=Q.top();
Q.pop();
int p=-1;
for(int i=0;i<K;i++)
if(C[i]==x.nod)
p=i;
if(p!=-1 and !(x.mask&(1<<p))){
int new_mask=(x.mask^(1<<p));
update(new_mask,x.nod,x.dist);
}
for(auto it:ADJ[x.nod])
update(x.mask,it.first,x.dist+it.second);
}
return DP[(1<<K)-1][N];
}
int main()
{
fin >> N >> M;
fin >> K;
C=vector<int>(K);
for(int i=0;i<K;i++)
fin >> C[i];
// for(int i=1;i<=K;i++)
// F[C[i]]=1;
for(int i=1;i<=M;i++){
int a,b,c;
fin >> a >> b >> c;
ADJ[a].push_back({b,c});
ADJ[b].push_back({a,c});
}
fout << Dijkstra();
return 0;
}