Cod sursa(job #2015092)

Utilizator giotoPopescu Ioan gioto Data 25 august 2017 00:21:30
Problema Team Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <bits/stdc++.h>
using namespace std;

int n, m, p, f[1005], dest[55];
const int INF = 2000000000;
vector <pair <int, int> > v[505];
queue <int> q;
int d[505][505];
int dp[55][55][55];
inline void bellmanford(int nod, int d[]){
    q.push(nod);
    d[nod] = 0;
    while(!q.empty()){
        int aux = q.front();
        q.pop();
        for(vector <pair <int, int> > :: iterator it = v[aux].begin(); it != v[aux].end() ; ++it){
            if(d[it->first] > d[aux] + it->second){
                d[it->first] = d[aux] + it->second;
                q.push(it->first);
            }
        }
    }
}
int main()
{
    freopen("team.in", "r", stdin);
    freopen("team.out", "w", stdout);
    scanf("%d%d%d", &p, &n, &m);
    int x, y, c;
    for(int i = 1; i <= m ; ++i){
        scanf("%d%d%d", &x, &y, &c);
        v[x].push_back(make_pair(y, c));
        v[y].push_back(make_pair(x, c));
    }
    for(int i = 0; i <= n ; ++i)
        for(int j = 0; j <= n ; ++j)
            d[i][j] = INF;
    for(int i = 1; i <= p ; ++i)
        scanf("%d", &dest[i]);
    dest[0] = 1;
    v[0].push_back(make_pair(1, 0));
    for(int i = 0; i <= p ; ++i)
        bellmanford(dest[i], d[i]);
    for(int st = p; st >= 1 ; --st)
        for(int dr = st; dr <= p ; ++dr)
            for(int k = 0; k <= p ; ++k){
                dp[st][dr][k] = INF;
                for(int nod = st; nod <= dr ; ++nod)
                    dp[st][dr][k] = min(dp[st][dr][k], dp[st][nod - 1][nod] + dp[nod + 1][dr][nod] + d[k][dest[nod]]);
            }
    printf("%d", dp[1][p][0]);
    return 0;
}