Cod sursa(job #3270486)

Utilizator AlexSerban21Serban Alexandru AlexSerban21 Data 23 ianuarie 2025 15:55:55
Problema Team Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.58 kb
#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;
}