Pagini recente » Cod sursa (job #1358560) | Cod sursa (job #1091310) | Cod sursa (job #1993708) | Cod sursa (job #2102351) | Cod sursa (job #830134)
Cod sursa(job #830134)
//Vasilut
#include<fstream>
#include<vector>
#include<utility>
#include<cstring>
#define NN 2010
#define INF 0x3f3f3f3f
using namespace std;
ofstream out("ubuntzei.out");
int n,m,K,v[NN],a[NN][NN],sol[NN],ans=INF;
bool uz[NN];
void read();
void RF();
void back(int k);
void write_sol();
int main()
{
read();
RF();
int perm[NN];
for(int i=1;i<=K;i++)
perm[i] = i;
if ( K )
{
do
{
int ttime = 0;
ttime = a[1][v[perm[1]]] + a[n][v[perm[K]]];
for(int i=1;i<K;i++)
ttime += a[v[perm[i]]][v[perm[i+1]]];
ans = min ( ans,ttime );
}
while(next_permutation(perm+1,perm+n+1));
//back(1);
out<<ans<<'\n';
}
else
out<<a[1][n];
return 0;
}
void read()
{
ifstream in("ubuntzei.in");
in>>n>>m;
in>>K;
for(int i=1;i<=K;i++)
in>>v[i];
memset(a,INF,sizeof a );
for(int i=1;i<=n;i++)
a[i][i] = 0;
for( int x,y,c ; m ; --m )
{
in>>x>>y>>c;
a[x][y] = a[y][x] = c;
}
}
void RF()
{
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
a[i][j] = min ( a[i][j] , a[i][k] + a[k][j] );
}
void back(int k)
{
for(int i=1;i<=K;i++)
if ( !uz[i] )
{
sol[k] = i;
uz[i] = 1;
if ( k == K )
write_sol();
else
back(k+1);
uz[i] = 0;
}
}
void write_sol()
{
int ttime = 0;
ttime = a[ 1 ][ v[ sol[ 1 ] ] ] + a[ v[ sol[ K ] ] ][ n ] ;
for(int i=1;i<K;i++)
ttime += a[ v[ sol[i] ] ][ v[ sol[ i+1 ] ] ];
ans = min ( ans , ttime );
}