Pagini recente » Cod sursa (job #2222018) | Cod sursa (job #2914337) | Cod sursa (job #2548547) | Cod sursa (job #2233754) | Cod sursa (job #2171631)
#include <fstream>
#include <algorithm>
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
#define inf 999999999
#define nn 2005
int cost,n,m,k,a[nn][nn],d[nn],v[50],vv[nn][nn];
bool s[nn],s2[50];
void read () {
f>>n>>m>>k;
for (int i=1;i<=n;++i)
for (int j=i+1;j<=n;++j)
a[i][j]=a[j][i]=inf;
for (int i=1;i<=k;++i)
f>>v[i];
for (int i=1;i<=m;++i) {
int x,y,z;
f>>x>>y>>z;
a[x][y]=a[y][x]=z;}}
void dijk (int x) {
for (int i=1;i<=n;++i)
d[i]=a[x][i],s[i]=0;
s[x]=1;
int kk;
while (1) {
int mi=inf;
for (int i=1;i<=n;++i)
if (!s[i] && mi>d[i]) {
mi=d[i];
kk=i;}
if (mi==inf)
break;
s[kk]=1;
for (int i=1;i<=n;++i)
if (!s[i] && d[i]>mi+a[kk][i])
d[i]=mi+a[kk][i];}
for (int i=1;i<=n;++i)
vv[x][i]=vv[i][x]=d[i];}
int fact (int k) {
if (k==1)
return 1;
else
return k*fact(k-1);}
void go () {
read();
dijk(1);
if (!k)
g<<vv[1][n]<<'\n';
else {
for (int i=1;i<=k;++i)
dijk(v[i]);
int sol=inf;
int nr=fact(k);
for (int i=1;i<=nr;++i) {
int cost=vv[1][v[1]];
for (int j=1;j<k;++j)
cost+=vv[v[j]][v[j+1]];
cost+=vv[v[k]][n];
if (cost<sol)
sol=cost;
next_permutation(v+1,v+k+1);}
g<<sol<<'\n';}}
int main()
{ go();
return 0;
}