Pagini recente » Cod sursa (job #197781) | Cod sursa (job #1366878) | Cod sursa (job #2084378) | Cod sursa (job #2119426) | Cod sursa (job #2172475)
#include <iostream>
#include<fstream>
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
bool viz[20];
long long n,m,k,c[20],i,x,y,cst,a[2011][2011],st[20],mn=1e17,ans,dp[2011][32000],s,j;
void prelucreaza()
{
ans=a[1][c[st[1]]]+a[c[st[k]]][n];
for(int i=1;i<k;i++)
{
ans+=a[c[st[i]]][c[st[i+1]]];
}
mn=min(mn,ans);
}
void perm(int p)
{
for(int i=1;i<=k;i++)
if(!viz[i])
{
st[p]=i;
viz[i]=1;
if(p<k)
{
perm(p+1);
}
else
prelucreaza();
viz[i]=0;
}
}
void royfloyd()
{
int i,j,k;
for(k=1; k<=n; k++)
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
if ( a[i][k] && a[k][j] && (a[i][j] > a[i][k] + a[k][j] || !a[i][j]) && i!=j )
a[i][j]=a[i][k]+a[k][j];
}
int main()
{
f>>n>>m>>k;
for(i=1;i<=k;i++)
f>>c[i];
for(i=1;i<=m;i++)
{
f>>x>>y>>cst;
a[x][y]=a[y][x]=cst;
}
royfloyd();
//perm(1);
//g<<mn;
for(i=1;i<=n;i++)
for(s=1;s<=(1<<k);s++)
dp[i][s]=1e17;
for(i=1;i<=n;i++)
{
dp[i][0]=a[1][i];
dp[i][1<<i]=a[1][i];
}
for(s=0;s<=(1<<k);s++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(a[i][j] && j!=i)
{
if(s>=(1<<j) && dp[j][s]>dp[i][s-(1<<j)]+a[j][i])
dp[j][s]=dp[i][s-(1<<j)]+a[j][i];
}
int sum=0;
for(i=1;i<=k;i++)
sum+=(1<<c[i]);
for(i=sum;i<=(1<<n);i++)
mn=min(mn,dp[n][i]);
g<<mn;
}