Cod sursa(job #1898142)

Utilizator FloareaCucura Floarea Ludovica Floarea Data 1 martie 2017 20:45:30
Problema Team Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <string.h>
#include <fstream>
#include <algorithm>
#include <queue>
#include <vector>

using namespace std;

ifstream fin("team.in");
ofstream fout("team.out");

using PII=pair<int,int>;
int P, N, M;
vector<PII> G[505];
int dist[55][505];
priority_queue<PII> Q;
int D[55];
int minC[55][55][55];

void Dijkstra(int p, int x);

int main()
{
    fin >> P >> N >> M;
    for (int i = 1; i <= M; ++i)
    {
        int x,y,z;
        fin >>x>>y>>z;
        G[x].push_back({y,z});
        G[y].push_back({x,z});
    }

    Dijkstra(0, 1);

    D[0] = 1;
    for (int i = 1; i <= P; ++i)
    {
        fin >> D[i];
        Dijkstra(i, D[i]);
    }

    memset(minC, 0x3f, sizeof(minC));
    for (int s = 1; s <= P; ++s)
        for (int i = 1; i <= P - s + 1; ++i)
        {
            int j = i + s - 1;
            for (int k = 0; k <= P; ++k)
                for (int l = i; l <= j; ++l)
                    minC[i][j][k] = min(minC[i][j][k], dist[k][D[l]] + (i <= l - 1 ? minC[i][l - 1][l] : 0) + (l + 1 <= j ? minC[l + 1][j][l] : 0));
        }

    fout << minC[1][P][0] << '\n';

    fin.close();
    fout.close();
}


void Dijkstra(int p, int x)
{
    memset(dist[p], 0x3f, sizeof(dist[p]));

    dist[p][x] = 0;
    Q.push(make_pair(0, x));

    while (!Q.empty())
    {
        auto pr = Q.top();
        Q.pop();

        if (-pr.first != dist[p][pr.second]) continue;
        for (auto edge : G[pr.second])
            if (-pr.first + edge.second < dist[p][edge.first])
            {
                dist[p][edge.first] = -pr.first + edge.second;
                Q.push({-dist[p][edge.first], edge.first});
            }
    }
}