Cod sursa(job #3357417)

Utilizator serban19serban colhon serban19 Data 9 iunie 2026 15:28:51
Problema Team Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.78 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++)
    {
        bool modificat = true;

        while(modificat)
        {
            modificat = false;

            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++)
                    {
                        long long nou =
                            dp[i][k][v] +
                            dp[k + 1][j][v];

                        if(nou < dp[i][j][v])
                        {
                            dp[i][j][v] = nou;
                            modificat = true;
                        }
                    }
                }

                int persoane = j - i + 1;

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

                    for(int v = 1; v <= n; v++)
                    {
                        long long nou =
                            dp[i][j][mid] +
                            1LL * persoane *
                            distanta[mid][v];

                        if(nou < dp[i][j][v])
                        {
                            dp[i][j][v] = nou;
                            modificat = true;
                        }
                    }
                }
            }
        }
    }

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

    return 0;
}