Pagini recente » Cod sursa (job #807130) | Statistici Vozian Valentin (vozian_valentin) | Statistici Gigel Maricel (RaiRE108) | Atasamentele paginii template/despre-infoarena | Cod sursa (job #2101064)
#include <bits/stdc++.h>
#define Nmax 2002
#define pii pair<int,int>
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
int D[16][Nmax],p[Nmax],n,k,m,x,y,c,DP[65537][16],mx;
bool uz[Nmax];
vector<pii> H;
vector<pii> v[Nmax];
bool comp(pii a,pii b) {return a.second>b.second;}
void make_bst(int fst,int poz)
{
H.push_back({fst,0});
D[poz][fst] = 0;
while (!H.empty())
{
int nod = H[0].first;
int val = H[0].second;
pop_heap(H.begin(),H.end(),comp);
H.pop_back();
if (D[poz][nod]<val)
continue;
for (auto it : v[nod])
if (D[poz][it.first]>val+it.second)
{
D[poz][it.first] = val+it.second;
H.push_back({it.first,val+it.second});
push_heap(H.begin(),H.end(),comp);
}
}
}
int main()
{
f>>n>>m;
f>>k;
for (int i=1;i<=k;i++)
f>>p[i];
for (int i=1;i<=m;i++)
{
f>>x>>y>>c;
v[x].push_back({y,c});
v[y].push_back({x,c});
}
memset(D,0x3f,sizeof(D));
make_bst(1,0);
for (int i=1;i<=k;i++)
make_bst(p[i],i);
mx = (1<<k);
memset(DP,0x3f,sizeof(DP));
for (int i=1;i<=k;i++)
DP[1<<(i-1)][i] = D[0][p[i]];
for (int i=0;i<mx;i++)
for (int s=1;s<=k;s++)
if ((i&(1<<(s-1)))!=0)
for (int j=1;j<=k;j++)
if ((i&(1<<(j-1)))==0)
DP[i+(1<<(j-1))][j] = min(DP[i+(1<<(j-1))][j],DP[i][s]+D[s][p[j]]);
int mn = 2e9;
for (int i=1;i<=k;i++)
mn = min(mn,DP[mx-1][i]+D[i][n]);
if (k==0)
mn = D[0][n];
g<<mn;
return 0;
}