Cod sursa(job #3357418)

Utilizator serban19serban colhon serban19 Data 9 iunie 2026 15:34:07
Problema Team Scor 5
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.32 kb
#include <bits/stdc++.h>
using namespace std;

const long long INF = 4e18;

long long distanta[505][505];
long long dp[55][55][505];

int destinatie[55];

int main()
{
    ifstream in("team.in");
    ofstream out("team.out");

    int p, n, m;

    in >> p;
    in >> n;
    in >> m;

    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= n; j++)
            if(i == j)
                distanta[i][j] = 0;
            else
                distanta[i][j] = INF;

    for(int i = 1; i <= m; i++)
    {
        int x, y, c;
        in >> x >> y >> c;

        distanta[x][y] = min(distanta[x][y], (long long)c);
        distanta[y][x] = min(distanta[y][x], (long long)c);
    }

    for(int k = 1; k <= n; k++)
        for(int i = 1; i <= n; i++)
            for(int j = 1; j <= n; j++)
                if(distanta[i][k] + distanta[k][j] <
                   distanta[i][j])
                    distanta[i][j] =
                        distanta[i][k] + distanta[k][j];

    for(int i = 1; i <= p; i++)
        in >> destinatie[i];

    for(int i = 1; i <= p; i++)
        for(int j = i; j <= p; j++)
            for(int v = 1; v <= n; v++)
                dp[i][j][v] = INF;

    for(int i = 1; i <= p; i++)
        dp[i][i][destinatie[i]] = 0;

   for(int lung = 1; lung <= p; lung++)
{
    for(int i = 1; i + lung - 1 <= p; i++)
    {
        int j = i + lung - 1;

        for(int k = i; k < j; k++)
        {
            for(int v = 1; v <= n; v++)
            {
                if(dp[i][k][v] == INF ||
                   dp[k + 1][j][v] == INF)
                    continue;

                dp[i][j][v] =
                    min(dp[i][j][v],
                        dp[i][k][v] +
                        dp[k + 1][j][v]);
            }
        }

        static long long f[505];

        for(int v = 1; v <= n; v++)
            f[v] = dp[i][j][v];

        for(int u = 1; u <= n; u++)
        {
            if(f[u] == INF)
                continue;

            for(int v = 1; v <= n; v++)
            {
                f[v] =
                    min(f[v],
                        f[u] + distanta[u][v]);
            }
        }

        for(int v = 1; v <= n; v++)
            dp[i][j][v] = f[v];
    }
}

    out << dp[1][p][1] << '\n';

    return 0;
}