Pagini recente » Cod sursa (job #413431) | Cod sursa (job #168857) | Cod sursa (job #2988046) | Cod sursa (job #1810660) | Cod sursa (job #886739)
Cod sursa(job #886739)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
long int i, j, k, c[2001][2001], n, m, v[2001], st[2001], nrp, s, mini = 10000, h;
void init()
{
for( i = 1; i <= n; i++ )
for( j = 1; j <= n; j++ )
if ( i == j )
c[i][j] = 0;
else
c[i][j] = 10000;
}
void rez()
{
for( k = 1; k <= n; k++ )
for ( i = 1; i <= n; i++ )
for ( j = 1; j <= n; j++ )
if( c[i][j] > c[i][k] + c[k][j] )
c[i][j] = c[i][k] + c[k][j];
}
void initial ()
{ st[k] = 0; }
int succesor()
{
if ( st[ k ] < nrp )
{
st[k]++;
return 1;
}
return 0;
}
int valid()
{
for( i = 1; i < k; i++ )
if ( st[i] == st[k] )
return 0;
return 1;
}
int solutie()
{ return k == nrp; }
void permutari()
{
s = 0;
s += c[1][v[st[1]]];
for ( h = 1; h < nrp; h++ )
s += c[v[st[h]]][v[st[h+1]]];
s += c[v[st[h]]][n];
if( s < mini )
mini = s;
}
void back()
{
int as, ev;
k = 1;
initial();
while( k > 0 )
{
as = 1;
ev = 0;
while( as && !ev )
{
as = succesor();
if ( as )
ev = valid();
}
if ( as )
if ( solutie () )
permutari();
else
{ k++; initial(); }
else
k--;
}
}
int main()
{
int x, y;
f>>n>>m;
f>>nrp;
for( i = 1; i <= nrp; i++ )
f>>v[i];
init();
for( i = 1; i <= m; i++ )
{
f>>x>>y;
f>>c[x][y];
c[y][x] = c[x][y];
}
rez();
back();
g<<mini;
return 0;
}