Pagini recente » Cod sursa (job #207165) | Cod sursa (job #1749869) | Cod sursa (job #2348838) | Cod sursa (job #2833488) | Cod sursa (job #1592124)
#include <bits/stdc++.h>
using namespace std;
class muchie {
public:
int unde, cost;
muchie(int unde = 0, int cost = 0) :
unde(unde), cost(cost) {};
};
constexpr static int inf = numeric_limits<int>::max() / 4;
vector<int>cities;
vector<bool>is_c;
int n, m, k;
int mask;
int indice[2048];
struct stare{
int nod, mask,acts;
stare(int nod = 0, int mask = 0):
mask(mask), nod(nod){};
};
using PII = pair<int, int>;
class graf
{
private:
constexpr static int nr_noduri = 2048;
vector<muchie>muc[nr_noduri];
unordered_map<int, int>dp[nr_noduri];
public:
graf(int n = 0,int k=0) {
}
void add(int x, int y, int cost) {
muc[x].push_back(muchie(y, cost));
muc[y].push_back(muchie(x, cost));
}
void solve() {
auto cmp = [&] (const stare&a, const stare &b){
return dp[a.nod][a.mask]>dp[b.nod][b.mask];
};
priority_queue<stare,vector<stare>,decltype(cmp)>q(cmp);
//stare ii nod,mask
int actnod=0,actmask=0;
if(is_c[0])actmask|=1<<indice[0];
q.push(stare(actnod,actmask));
vector<vector<bool>>viz(n, vector<bool>(1<<k));
dp[0][actmask] = 0;
while(!q.empty())
{
auto emp = q.top();
q.pop();
int maska=emp.mask,nod=emp.nod, ce_cost = dp[nod][maska];
viz[nod][maska]=0;
for(auto vec : muc[nod])
{
int nc=vec.cost+ce_cost,nod_nou=vec.unde;
int new_mask=maska;
if(is_c[nod_nou])new_mask|=1<<indice[nod_nou];
if(dp[nod_nou].find(new_mask)!=end(dp[nod_nou]) && nc>=dp[nod_nou][new_mask])continue;
dp[nod_nou][new_mask]=nc;
if(viz[nod_nou][new_mask])continue;
viz[nod_nou][new_mask]=1;
q.push(stare(nod_nou, new_mask));
}
}
ofstream("ubuntzei.out") <<dp[n-1][mask];
}
};
graf G;
void read() {
ifstream cin("ubuntzei.in");
cin >> n >> m >> k;
cities.resize(k), is_c.resize(n);
G = graf(n,k);
for(int i = 0; i < k; ++i) {
cin >> cities[i];
cities[i]--;
is_c[cities[i]] = 1;
indice[cities[i]]=i;
mask |= 1<<i;
}
for(int i = 0; i < m; ++i) {
int a, b, cost;
cin >> a >> b >> cost;
a--; b--;
G.add(a, b, cost);
}
}
int main() {
read();
G.solve();
return 0;
}