Pagini recente » Cod sursa (job #1410729) | Cod sursa (job #562872) | Cod sursa (job #2246037) | Cod sursa (job #999815) | Cod sursa (job #1792407)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
int n,m,k,q[20],K,x,y,j,C[100000][20],i,aux,d[2005][2005],g[2005],c,sol;
struct NNND{int nod,val;}p;
vector<NNND>v[2005];
queue<int>C1;
int main()
{fin>>n>>m;
fin>>K;
for(i=1;i<=K;i++)
{fin>>q[i];
q[i]--;
}
for(i=1;i<=m;i++)
{fin>>x>>p.nod>>p.val;
p.nod--;
x--;
v[x].push_back(p);
g[x]++;
aux=x;
x=p.nod;
p.nod=aux;
v[x].push_back(p);
g[x]++;
}
for(i=0;i<n;i++)
{for(j=0;j<n;j++)
{d[i][j]=1000000000;
d[j][i]=1000000000;
}
}
for(i=0;i<n;i++)
d[i][i]=0;
q[0]=0;
q[K+1]=n-1;
K++;
for(k=0;k<=K;k++)
{C1.push(q[k]);//fout<<"\n\n";
while(C1.empty()==0)
{c=C1.front();
C1.pop();//fout<<"\n"<<c<<" | ";
for(i=0;i<g[c];i++)
{//fout<<v[c][i].nod<<" ";
if(d[q[k]][v[c][i].nod]>d[q[k]][c]+v[c][i].val){d[q[k]][v[c][i].nod]=d[q[k]][c]+v[c][i].val;
//fout<<"* "<<d[q[k]][v[c][i].nod]<<" ";
C1.push(v[c][i].nod);
}
}
}
}
for(i=0;i<(1<<(K));i++)
for(j=0;j<=K+1;j++)
C[i][q[j]]=1000000000;
C[1][0]=0;
for(i=0;i<(1<<(K));i++)
{//fout<<"\n"<<i<<"\n";
for(j=0;j<=K;j++)
{if(i&(1<<j))
{for(k=0;k<=K;k++)
{if(k!=j&&(i&(1<<k))){C[i][j]=min(C[i][j],C[i-(1<<j)][k]+d[q[k]][q[j]]);
// fout<<C[i][j]<<" ";
}
}
}
}
}
sol=1000000001;
//fout<<"\n"<<C[1<<(K+1)-1][2];
for(k=0;k<=K-1;k++)
{sol=min(sol,C[(1<<K)-1][k]+d[q[k]][n-1]);
}
fout<<sol;
}