Pagini recente » Cod sursa (job #1862063) | Cod sursa (job #3292523) | Cod sursa (job #2658430) | Cod sursa (job #2770722) | Cod sursa (job #3270486)
#include <fstream>
#define inf 25000000
using namespace std;
ifstream fin ("team.in");
ofstream fout ("team.out");
int p,n,m,poz[52],d[501][501],dp[51][51][52];
void dist ()
{
for (int i=1; i<=n; i++)
{
for (int j=i+1; j<=n; j++)
d[i][j]=d[j][i]=inf;
}
int x,y,c;
for (int i=1; i<=m; i++)
{
fin>>x>>y>>c;
d[x][y]=d[y][x]=min (d[x][y],c);
}
for (int k=1; k<=n; k++)
{
for (int i=1; i<=n; i++)
{
for (int j=i+1; j<=n; j++)
d[i][j]=d[j][i]=min (d[i][j],min (d[i][k]+d[k][j],d[j][k]+d[k][i]));
}
}
}
void dinamica ()
{
/**
dp[i][j][nod]=dp[i][k-1][posk]+dp[k+1][j][posk]+dist (nod,k)
**/
for (int i=1; i<=p; i++)
{
for (int j=i; j<=p; j++)
{
for (int k=1; k<=p; k++)
dp[i][j][k]=inf;
}
}
for (int i=p; i>0; i--)
{
for (int j=i; j<=p; j++)
{
for (int k=1; k<=p; k++)
{
for (int nod=i; nod<=j; nod++)
{
if (i==j)
dp[i][i][k]=min (dp[i][i][k],d[poz[i]][poz[k]]);
else
dp[i][j][k]=min (dp[i][j][k],dp[i][nod-1][nod]+dp[nod+1][j][nod]+d[poz[k]][poz[nod]]);
}
}
}
}
}
int main()
{
fin>>p>>n>>m;
p++;
dist ();
poz[1]=1;
for (int i=2; i<=p+1; i++)
fin>>poz[i];
dinamica ();
fout<<dp[1][p][1];
return 0;
}