Pagini recente » Cod sursa (job #2933646) | Cod sursa (job #653820) | Cod sursa (job #3351154) | Cod sursa (job #3327034) | Cod sursa (job #3308879)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("ubuntzei.in");
ofstream fout ("ubuntzei.out");
vector <pair<int,int>> gr[2005];
priority_queue <pair<int,int>> pq;
int dist[2005];
int ks[22];
int mx[22][22]; // matricea de adiacenta
int dp[1<<20][22];
void Dijkstra(int node,int n){
for (int i=1;i<=n;++i) dist[i] = 1e9;
dist[node] = 0;
pq.push({-dist[node],node});
while (!pq.empty()){
int cnode = pq.top().second;
int dst = -pq.top().first;
pq.pop();
if (dst!=dist[cnode]) continue;
for (auto vec:gr[cnode]){
if (dist[vec.first]<=dist[cnode]+vec.second) continue;
dist[vec.first] = dist[cnode]+vec.second;
pq.push({-dist[vec.first],vec.first});
}
}
}
bool CheckBit(int msk,int bit){ // este bitul 1?
return (msk&(1<<bit))!=0;
}
int Add(int msk,int bit){
return msk|(1<<bit);
}
int Ciclu_Hamiltonian(int n){
for (int i=0;i<(1<<n);++i){
for (int j=0;j<n;++j){
dp[i][j] = 1e9;
}
}
dp[1][0] = 0;
for (int msk=0;msk<(1<<n);msk++){
for (int nod1=0;nod1<n;++nod1){
if (!CheckBit(msk,nod1)) continue;
for (int nod2=0;nod2<n;++nod2){
if (CheckBit(msk,nod2) or nod1==nod2) continue;
int msk2 = Add(msk,nod2);
dp[msk2][nod2] = min(dp[msk2][nod2],dp[msk][nod1]+mx[nod1][nod2]);
}
}
}
int ans = dp[(1<<n)-1][n-1];
return ans;
}
int main()
{
int n,m,k;
fin >> n >> m >> k;
for (int i=1;i<=k;++i){
fin >> ks[i];
}
for (int i=1;i<=m;++i){
int x,y,dst;
fin >> x >> y >> dst;
gr[x].push_back({y,dst});
gr[y].push_back({x,dst});
}
ks[0] = 1;
ks[k+1] = n;
for (int i=0;i<=k+1;++i){
for (int j=0;j<=k+1;++j){
mx[i][j] = 1e9;
}
}
for (int i=0;i<=k+1;++i){
Dijkstra(ks[i],n);
for (int j=0;j<=k+1;++j){
mx[i][j] = dist[ks[j]];
//mx[j][i] = dist[ks[j]];
}
}
int ans = Ciclu_Hamiltonian(k+2);
fout << ans;
return 0;
}