Pagini recente » Cod sursa (job #7970) | Cod sursa (job #1355384) | Cod sursa (job #890328) | Cod sursa (job #1886708) | Cod sursa (job #1743262)
#include <fstream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
ofstream g("ubuntzei.out");
long n,k,m,v[20],x,y,uz[20],val,d,mn[2005],mat[20][20],minim,p[20];
struct Heap{
long nod,val;
};
vector <Heap> H[2005];
vector <Heap> Hp;
long comp(Heap a,Heap b)
{
return a.val>b.val;
}
void mini(long poz,long nod)
{
long lg;
memset(mn,0,sizeof(mn));
Heap crt;
crt.nod = nod;
crt.val = 0;
Hp.push_back(crt);
while (!Hp.empty())
{
nod = Hp[0].nod;
lg = Hp[0].val;
pop_heap(Hp.begin(),Hp.end(),comp);
Hp.pop_back();
for (int i=0;i<H[nod].size();i++)
{
if (mn[H[nod][i].nod] == 0 || mn[H[nod][i].nod]>H[nod][i].val+lg)
{
mn[H[nod][i].nod] = H[nod][i].val+lg;
Heap crt;
crt.nod = H[nod][i].nod;
crt.val = H[nod][i].val+lg;
Hp.push_back(crt);
push_heap(Hp.begin(),Hp.end(),comp);
}
}
}
mat[poz][1] = mn[1];
mat[poz][k+2] = mn[n];
for (int i=1;i<=k;i++)
mat[poz][i+1] = mn[v[i]];
}
void bkt(long k2)
{
if (k2>k+1)
{
if (val+mat[p[k+1]][k+2]<minim || minim==-1)
minim=val+mat[p[k+1]][k+2];
}
else
for (int i=2;i<=k+1;i++)
{
if (uz[i]==0)
{
uz[i]=1;
val = val+mat[p[i-1]][i];
p[k2] = i;
if (val>=minim && minim!=-1)
return;
bkt(k2+1);
val = val-mat[p[i-1]][i];
uz[i]=0;
}
}
}
int main()
{
freopen("ubuntzei.in","r",stdin);
scanf("%ld%ld",&n,&m);
scanf("%ld",&k);
for (int i=1;i<=k;i++)
scanf("%ld",&v[i]);
for (int i=1;i<=m;i++)
{
scanf("%ld%ld%ld",&x,&y,&d);
Heap crt;
crt.nod = y;
crt.val = d;
H[x].push_back(crt);
crt.nod = x;
H[y].push_back(crt);
}
mini(1,1);
for (int i=1;i<=k;i++)
mini(i+1,v[i]);
mini(k+2,n);
/*for (int i=1;i<=k+2;i++)
{
H[i].clear();
for (int j=1;i<=k+2;j++)
if (i!=j)
{
Heap crt;
crt.nod = j;
crt.val = mat[i][j];
H[i].push_back(crt);
}
}*/
p[1] = 1;
minim = -1;
bkt(2);
g<<minim;
return 0;
}