Pagini recente » Istoria paginii runda/test_casian2/clasament | Cod sursa (job #2904139) | Istoria paginii runda/preoni-cl._5-8/clasament | Cod sursa (job #2438848) | Cod sursa (job #2016615)
#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
int n,m,k,v[2005],a,b,f=-1,y[2005],z;
vector<pair<int,int> >x[2005];
int r[25][2005];
int rez[(1<<16)][25],g;
queue<int>q;
void ve()
{
int nod;
while(!q.empty())
{
nod=q.front();
q.pop();
for(auto i:x[nod])
{
if(i.first!=y[f])
if(r[f][i.first]==0||r[f][nod]+i.second<r[f][i.first])
{
r[f][i.first]=r[f][nod]+i.second;
q.push(i.first);
}
}
}
}
int main()
{
//cout<<sizeof(rez)/1000;
fin>>n>>m;
fin>>k;
for(int i=1;i<=k;i++)
{
fin>>a;
y[i]=a;
v[a]=i;
}
for(int i=1;i<=m;i++)
{
fin>>a>>b>>z;
x[a].push_back(make_pair(b,z));
x[b].push_back(make_pair(a,z));
}
y[0]=1;
f++;
q.push(1);
ve();
for(int i=1;i<=k;i++)
{
f++;
q.push(y[i]);
ve();
}
if(k==0)
{
fout<<r[0][n];
return 0;
}
int p=(1<<k),nr,s;
for(int i=1;i<p;i++)
for(int j=0;j<k;j++)
if(((1<<j)&i))
{
if(i==(1<<j))
rez[i][j+1]=r[0][y[j+1]];
//cout<<rez[i][j+1]<<'\n';
for(int h=0;h<k;h++)
if(!((1<<h)&i))
if(rez[((1<<h)|i)][h+1]==0||rez[i][y[j+1]]+r[j+1][h+1]<rez[((1<<h)|i)][h+1])
rez[((1<<h)|i)][h+1]=rez[i][y[j+1]]+r[j+1][h+1];
}
int mi=rez[p-1][1]+r[1][n];
for(int i=2;i<=k;i++)
mi=min(mi,rez[p-1][i]+r[i][n]);
fout<<mi;
}