Pagini recente » Cod sursa (job #2221165) | Cod sursa (job #1425151) | Cod sursa (job #979300) | Cod sursa (job #1026613) | Cod sursa (job #2244511)
#include <fstream>
#include <queue>
#include <algorithm>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
vector<pair <int, int> > v[2001];
vector<pair <int, int> >::iterator it;
priority_queue<pair<int,int> , vector<pair<int,int> > , greater<pair<int,int> > > h;
deque<pair<int,int> > hh;
int n,m,i,a,b,c,cost,nod,vecin,f[2001],nr,d[2001],mini,dir;
int ma[18][18],fa[2001],k,l[18],r,j;
int dd[131072][17],ff[131072][17];
void solve(int poz)
{
for(i=1;i<=n;i++)
{
d[i]=2000000000;
f[i]=0;
}
d[poz]=0;
h.push(make_pair(d[poz], poz));
while(!h.empty())
{
nod=h.top().second;
h.pop();
while(f[nod]==1)
{
if(h.empty())
break;
nod=h.top().second;
h.pop();
}
f[nod]=1;
for(it=v[nod].begin();it!=v[nod].end();it++)
{
vecin=it->first;
cost=it->second;
if(f[vecin]==0&&d[vecin]>d[nod]+cost)
{
d[vecin]=d[nod]+cost;
h.push(make_pair(d[vecin], vecin));
}
}
}
for(i=1;i<=n;i++)
if(i!=poz&&fa[i]!=0)
{
ma[fa[poz]][fa[i]]=min(d[i],ma[fa[poz]][fa[i]]);
ma[fa[i]][fa[poz]]=min(d[i],ma[fa[i]][fa[poz]]);
}
}
int main()
{
fin>>n>>m;
fin>>k;
for(i=1;i<=k;i++)
fin>>l[i];
l[++k]=n;
l[++k]=1;
sort(l+1, l+k+1);
for(i=1;i<=k;i++) for(j=1;j<=k;j++) ma[i][j]=2000000000;
for(i=1;i<=k;i++)
fa[l[i]]=i;
for(i=1;i<=m;i++)
{
fin>>a>>b>>c;
v[a].push_back(make_pair(b, c));
v[b].push_back(make_pair(a, c));
}
for(j=1;j<=k;j++)
solve(l[j]);
for(i=1;i<k;i++)
r+=(1<<i);
for(i=0;i<=r;i++)
for(j=0;j<k;j++)
dd[i][j]=2000000000;
dd[r][0]=0;
hh.push_back(make_pair(r, 0));
while(!hh.empty())
{
nod=hh[0].first;
dir=hh[0].second;
hh.pop_front();
ff[nod][dir]=0;
for(j=0;j<k;j++)
if((nod&(1<<j))!=0)
{
vecin=nod-(1<<j);
cost=ma[dir+1][j+1];
if(dd[vecin][j]>dd[nod][dir]+cost)
{
dd[vecin][j]=dd[nod][dir]+cost;
if(ff[vecin][j]==0)
{
hh.push_back(make_pair(vecin, j));
ff[vecin][j]=1;
}
}
}
}
int sol=2000000000;
for(i=0;i<k;i++)
sol=min(sol, dd[0][i]);
fout<<sol;
fin.close();
fout.close();
return 0;
}