Pagini recente » Cod sursa (job #3280791) | Cod sursa (job #3187892) | Cod sursa (job #28190) | Cod sursa (job #21122) | Cod sursa (job #895159)
Cod sursa(job #895159)
#include<fstream>
#include<algorithm>
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
int n,m,b[9000],k,sum,v[200];
long long int a[9999][9999],s;
int const MAX=999999;
void init()
{f>>n>>m>>k;
int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i==j) a[i][j]=0;
else a[i][j]=MAX;
}
void citire()
{int c,d,e;
for(int i=1;i<=k;i++)
f>>b[i];
for(int i=1;i<=m;i++)
{f>>d>>e>>c;
a[d][e]=c;a[e][d]=c;
}
}
void transf()
{for(int d=1;d<=n;d++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(a[i][d]+a[d][j]<a[i][j])
a[i][j]=a[i][d]+a[d][j];
}
void solutia()
{s=MAX;int i;
if(k!=0)
{for(i=1;i<=k;i++)
v[i]=i;
do
{sum=a[1][b[v[1]]];
if (sum<s)
{
for(int p=2;p<=k;p++)
{sum+=a[b[v[p-1]]][b[v[p]]];
if(sum>=s)p=k+1;
}
if(sum<s)
sum+=a[b[v[k]]][n];
}if(sum<s)
s=sum;
}while(next_permutation(v+1,v+k+1));
g<<s;
}else g<<a[1][n];
}
int main()
{
init(); citire(); transf();solutia();f.close();g.close();
}