Cod sursa(job #2444241)

Utilizator CharacterMeCharacter Me CharacterMe Data 30 iulie 2019 18:07:47
Problema Team Scor 75
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.11 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#define cost first
#define node second
#define inf 1000000001
#define pii pair<int, int>
using namespace std;
int n, m, p, i, j, k, sol[501][51][51], dist[501][501], q, source[51], out=inf, l;
vector<pii> graph[501];
priority_queue<pii, vector<pii>, greater<pii> > pq;
void dijkstra(int start);
int main()
{
    freopen("team.in", "r", stdin);
    freopen("team.out", "w", stdout);
    scanf("%d%d%d", &p, &n, &m);
    for(i=1; i<=n; ++i)
        for(j=1; j<=n; ++j) if(i!=j)dist[i][j]=inf;
    for(i=1; i<=n; ++i)
        for(j=1; j<=p; ++j)
            for(k=1; k<=p; ++k) sol[i][j][k]=inf;
    for(i=1; i<=m; ++i){
        int x, y, c;
        scanf("%d%d%d", &x, &y, &c);
        graph[x].push_back({c, y});
        graph[y].push_back({c, x});
    }
    for(i=1; i<=p; ++i) scanf("%d", &source[i]);
    for(i=1; i<=p; ++i) dijkstra(source[i]);
    for(i=1; i<=p; ++i)
    for(j=1; j<=p; ++j) {
        sol[source[j]][i][i]=dist[source[i]][source[j]];
    }
    for(k=1; k<p; ++k)
    for(i=1; i<=p-k; ++i){
        j=i+k;
        for(q=i; q<=j; ++q){
            int f, s;
            f=s=sol[source[q]][i][j];
            if(q>i)for(l=i; l<=q-1; ++l)
                f=min(f, sol[source[l]][i][q-1]+dist[source[l]][source[q]]);
            else f=0;
            if(q<j)for(l=q+1; l<=j; ++l)
                s=min(s, sol[source[l]][q+1][j]+dist[source[l]][source[q]]);
            else s=0;
            sol[source[q]][i][j]=f+s;
        }
    }
    for(i=1; i<=p; ++i){
        out=min(out, sol[source[i]][1][p]+dist[source[i]][1]);
    }
    printf("%d", out);
    return 0;
}
void dijkstra(int start){
    pq.push({0, start});
    while(!pq.empty()){
        pii init=pq.top(), next; pq.pop();
        if(dist[start][init.node]!=init.cost) continue;
        for(auto j:graph[init.node]){
            next={init.cost+j.cost, j.node};
            if(next.cost<dist[start][next.node]){
                dist[start][next.node]=next.cost;
                pq.push(next);
            }
        }
    }
    return;
}