Pagini recente » Cod sursa (job #1850413) | Cod sursa (job #1124430) | Cod sursa (job #3138792) | Cod sursa (job #889254) | Cod sursa (job #1623143)
#include <fstream>
#define inf 16830
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
int c[201][201],d[201],use[201],n,m,k,c1[201],nr,d1[20],x[20];
void citire()
{ int i,j,x,y,cost;
f>>n>>m;
f>>k;
for(i=1;i<=k;i++)
f>>c1[i];
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i==j) c[i][j]=0;
else c[i][j]=inf;
for(i=1;i<=m;i++)
{f>>x>>y>>cost;
c[x][y]=cost;
c[y][x]=cost;
}
}
void dijkstra()
{int x,min1,i;
for(i=1;i<=n;i++) d[i]=inf;
d[1]=0;
while(1)
{min1=inf;
for(i=1;i<=n;i++)
if(!use[i]&&d[i]<min1)
{min1=d[i];
x=i;
}
if(min1==inf) break;
use[x]=1;
for(i=1;i<=n;i++)
if(d[x]+c[x][i]<d[i])
{d[i]=d[x]+c[x][i];
//t[i]=x;
}
}
}
void floyd()
{for (int k=1;k<=n;k++)
for (int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(c[i][k]+c[k][j]<c[i][j]) c[i][j]=c[i][k]+c[k][j];
}
int valid (int k1)
{ for(int i=1;i<k1;i++)
if(x[k1]==x[i]) return 0;
return 1;
}
void suma()
{ int s=c[1][c1[x[1]]];
for(int i=2;i<=k;i++)
s=s+c[c1[x[i-1]]][c1[x[i]]];
s=s+c[c1[x[k]]][n];
d1[++nr]=s;
}
void back(int k1)
{ for(int i=1;i<=k;i++)
{ x[k1]=i;
if(valid(k1))
if(k1==k) suma ();
else back(k1+1);
}
}
int main()
{ int min1=inf;
citire();
if(k==0)
{dijkstra();
g<<d[n]<<endl;
}
else
{ floyd();
back(1);
for(int i=1;i<=nr;i++)
if(min1>d1[i]) min1=d1[i];
g<<min1;
}
return 0;
}