Pagini recente » Cod sursa (job #1043914) | Istoria paginii utilizator/4ndu4n | Cod sursa (job #2194928) | Cod sursa (job #2991244) | Cod sursa (job #1590056)
#include<fstream>
#include<deque>
#include<cstring>
#include<vector>
#define inf 0x7f7f7f7f
using namespace std;
vector<pair<int, int> > L[2002], L2[20];
deque<int> k;
int n, m, nk, kv[20], x, y, z, nodk, p1, s, h[2002], p[2002], D[20][2002], Dh[1<<16][16], i, nrh, nod, vecin, cost, j, stare, urmstare, sol, nrkv;
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
int main()
{
in>>n>>m;
in>>nk;
k.push_back(1);
kv[++nrkv]=1;
for(i=1; i<=nk; i++)
{
in>>x;
kv[++nrkv]=x;
k.push_back(x);
}
nk++;
for(i=1; i<=m; i++)
{
in>>x>>y>>z;
L[x].push_back(make_pair(y, z));
L[y].push_back(make_pair(x, z));
}
while(!k.empty())
{
nodk=k.front();
memset(D[nodk], 127, sizeof(D[nodk]));
D[nodk][nodk]=0;
memset(h, 0, sizeof(h));
memset(p, 0, sizeof(p));
h[1]=k.front();
p[h[1]]=1;
nrh=1;
k.pop_front();
while(nrh!=0)
{
nod=h[1];
h[1]=h[nrh];
p[h[1]]=1;
nrh--;
p1=1;
s=2;
while(s<=nrh)
{
if(s+1<=nrh && D[nodk][h[s+1]]<D[nodk][h[s]])
s++;
if(D[nodk][h[s]]<D[nodk][h[p1]])
{
swap(h[s], h[p1]);
p[h[s]]=s;
p[h[p1]]=p1;
p1=s;
s*=2;
}else
{
break;
}
}
for(i=0; i<L[nod].size(); i++)
{
vecin=L[nod][i].first;
cost=L[nod][i].second;
if(D[nodk][vecin]>D[nodk][nod]+cost)
{
D[nodk][vecin]=D[nodk][nod]+cost;
if(p[vecin]!=0)
{
s=p[vecin];
p1=s/2;
}else
{
h[++nrh]=vecin;
p[vecin]=nrh;
s=nrh;
p1=s/2;
}
while(p1!=0 && D[nodk][h[s]]<D[nodk][h[p1]])
{
swap(h[s], h[p1]);
p[h[p1]]=p1;
p[h[s]]=s;
s=p1;
p1/=2;
}
}
}
}
}
for(i=1; i<nk; i++)
{
for(j=i+1; j<=nk; j++)
{
L2[i-1].push_back(make_pair(j-1, D[kv[i]][kv[j]]));
L2[j-1].push_back(make_pair(i-1, D[kv[j]][kv[i]]));
}
}
memset(Dh, 127, sizeof(Dh));
Dh[1][0]=0;
for(stare=1; stare<(1<<nk); stare++)
{
for(nod=0; nod<nk; nod++)
{
if(Dh[stare][nod]!=inf)
{
for(i=0; i<L2[nod].size(); i++)
{
vecin=L2[nod][i].first;
cost=L2[nod][i].second;
if((stare&(1<<vecin))==0)
{
urmstare=stare+(1<<vecin);
Dh[urmstare][vecin]=min(Dh[urmstare][vecin], Dh[stare][nod]+cost);
}
}
}
}
}
sol=inf;
for(i=1; i<nk; i++)
{
sol=min(sol, Dh[(1<<nk)-1][i]+D[kv[i+1]][n]);
}
out<<sol;
return 0;
}