Pagini recente » Cod sursa (job #2794451) | Cod sursa (job #1908788) | Cod sursa (job #855256) | Cod sursa (job #764507) | Cod sursa (job #830127)
Cod sursa(job #830127)
//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();
back(1);
out<<ans<<'\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]]];
ttime += a[v[sol[K]]][n];
for(int i=2;i<K-1;i++)
ttime += a[v[sol[i]]][v[sol[i+1]]];
ans = min ( ans , ttime );
}