Pagini recente » Cod sursa (job #1294674) | Cod sursa (job #1804712) | Cod sursa (job #2675087) | Cod sursa (job #392074) | Cod sursa (job #874612)
Cod sursa(job #874612)
#include<fstream>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
int a[2001][2001],m,n,k,p[2001],minn = 999;
int o[16],sol[20];
void Read()
{
fin>>n>>m>>k;
for(int i=1 ; i<=k ; i++)
fin>>o[i];
for(int i=1 ; i<=m ; i ++)
{ int x,y,z;
fin>>x>>y>>z;
a[x][y] = z;
a[y][x] = z;
}
}
void rf()
{
for(int q=1 ; q<=n ;q++)
for(int i=1 ; i<=n ; i++)
for(int j=1 ; j<=n ; j++)
if( a[i][q] && a[q][j] && i!=j )
if( ( a[i][q] + a[q][j] < a[i][j] ) || !a[i][j] )
a[i][j] = a[i][q] + a[q][j];
}
void permutari(int pas , int sp)
{
for(int i=1 ; i<=k ; i++)
if(!p[o[i]])
{
p[o[i]] = 1;
sol[pas] = o[i];
if(pas==1)
sp += a[1][o[i]];
else
sp += a[sol[pas-1]][sol[pas]];
if( pas == k ){ sp+=a[sol[pas]][ n ];
if(sp < minn) minn = sp;
}
else permutari(pas+1 , sp);
if(pas==1) sp -= a[1][o[i]];
else if (pas < n) sp -= a[sol[pas-1]][sol[pas]];
else if( pas == k ) sp-=a[sol[pas]][ n ];
p[o[i]] = 0;
}
}
int main()
{
Read();
rf();
if(k==0)fout<<a[1][n];
else if(k!=0)
{
permutari(1,0);
fout<<minn;
}
fin.close();
fout.close();
return 0;
}