Pagini recente » Cod sursa (job #2768556) | Cod sursa (job #53904) | Cod sursa (job #2366285) | Cod sursa (job #2655501) | Cod sursa (job #642817)
Cod sursa(job #642817)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
int t,T[1998],a[2000][2000],d[1998],n,m,costm=15000,n1,n2,sol[1998],j,o=1;
void citesc()
{
int x,y,c;
in>>n;
in>>m;
in>>t;
for (int i=1;i<=t;++i)
in>>T[i];
for (int i=1;i<=m;++i)
{
in>>x;
in>>y;
in>>c;
a[x][y]=c;
a[y][x]=c;
}
for (int i=1;i<=n;++i)
{for (int j=1;j<=n;++j)
if (a[i][j]==0 && i!=j) a[i][j]=15000;
}
}
void roy_floyd()
{
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][k]+a[k][j],a[i][j]);
}
void distanta()
{
int dist=0;
dist=a[1][T[sol[1]]];
for (int y=1;y<t;++y)
dist=dist+a[T[sol[y]]][T[sol[y+1]]];
dist=dist+a[T[sol[t]]][n];
d[o]=dist;o++;
}
int valid (int k)
{
int j;
for (int i=1; i<k; i++)
if (sol[k]==sol[i]) return 0; return 1;
}
void back(int k)
{
if (k==t+1)
{
distanta();
}
else
{
sol[k]=0;
while (sol[k]<t)
{
sol[k]++;
if ( valid(k) ) back(k+1);
}
}
}
int main()
{
int mi;
citesc();
roy_floyd();
if (t!=0) {back(1);
mi=30000;
for (int i=1;i<o;++i)
if (d[i]<mi) mi=d[i];
//out<<d[i]<<" ";
out<<mi;}
else out<<a[1][n];
return 0;
}