Pagini recente » Cod sursa (job #1245284) | Cod sursa (job #2146043) | Cod sursa (job #1682483) | Cod sursa (job #1961892) | Cod sursa (job #2003816)
#include <fstream>
#include <climits>
using namespace std;
ifstream f ("ubuntzei.in");
ofstream g ("ubuntzei.out");
int n,suma,sol=INT_MAX,k,perm[23],v[2003][2003],viz[23],m,go[23],a,b,c;
void solve(int nr)
{
if(nr==k+1)
{
suma=v[1][go[perm[1]]];
for(int i=2;i<=k;++i) suma+=v[go[perm[i-1]]][go[perm[i]]];
suma+=v[go[perm[k]]][n];
if(suma<sol) sol=suma;
return;
}
for(int i=1;i<=k;++i)
{
if(viz[i]==false)
{
viz[i]=true;
perm[nr]=i;
solve(nr+1);
viz[i]=false;
}
}
}
int main()
{
f>>n>>m>>k;
for(int i=1;i<=k;++i) f>>go[i];
for(int i=1;i<=m;++i)
{
f>>a>>b>>c;
v[a][b]=v[b][a]=c;
}
for(int k=1;k<=n;++k)
{
for(int i=1;i<=n;++i)
{
for(int j=1;j<=n;++j)
{
if(v[i][k]&&v[k][j]&&i!=j&&j!=k&&k!=i&&(!v[i][j]||v[i][k]+v[k][j]<v[i][j])) v[i][j]=v[i][k]+v[k][j];
}
}
}
if(k>=2) solve(1);
else if(k==1)
{
sol=v[1][go[1]]+v[go[1]][n];
}
else if(k==0) sol=v[1][n];
g<<sol;
return 0;
}