Pagini recente » Cod sursa (job #2558994) | Cod sursa (job #1523762) | Cod sursa (job #2026930) | Cod sursa (job #1174391) | Cod sursa (job #2339673)
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <string.h>
#include <limits.h>
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
int k, V[201], D[20001][20001],n,m,minim=100000, S[201],s=0;
int viz[101];
void Citire()
{int i, j,x,y,c,inf=100000;
f>>n>>m>>k;
for(i=1;i<=k;i++)
f>>V[i];
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{ if(i==j)
D[i][j]=0;
else
D[i][j]=100000;}
for(i=1;i<=m;i++)
{f>>x>>y>>c;
D[x][y]=c;
}
}
void Roy_Floyd()
{int l, i ,j;
for(l=1;l<=n;l++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(D[i][j]>D[i][l]+D[l][j]&&D[i][l]!=100000&&D[l][j]!=100000)
D[i][j]=D[i][l]+D[l][j];
}
void Backtracking(int kk)
{int i,ok,j;
if(kk==k+1)
{ s=s+D[1][V[S[1]]];
for(i=1;i<k;i++)
s=s+D[V[S[i]]][V[S[i+1]]];
s=s+D[V[S[k]]][n];
if(s<minim)
minim=s;
s=0;
}
else { for(i=1;i<=k;i++)
if(viz[i]==0)
{ S[kk]=i;
viz[i]=1;
Backtracking(kk+1);
viz[i]=0;
}
}
}
int main()
{
Citire();
Roy_Floyd();
Backtracking(1);
if(k==0)
g<<D[1][n]
else
g<<minim;
f.close();
g.close();
return 0;
}