Cod sursa(job #1721494)

Utilizator fanache99Constantin-Buliga Stefan fanache99 Data 25 iunie 2016 19:23:00
Problema Team Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.03 kb
#include<cstdio>
#include<vector>
#include<cstring>
#include<queue>
#define MAXN 55
#define MAXV 510
#define INF 1000000000
using namespace std;
int people,vertices,edges;
int cost[MAXN][MAXN],best[MAXV],destination[MAXN],dp[MAXN][MAXN][MAXN];
vector<pair<int,int> > g[MAXV];
class Compare{
    public:
    bool operator()(int &x,int &y){
        return best[x]>best[y];
    }
};
priority_queue<int,vector<int>,Compare> Heap;
void Dijkstra(int start){
    int i,node;
    for(i=0;i<=vertices;i++)
        best[i]=INF;
    best[start]=0;
    Heap.push(start);
    while(!Heap.empty()){
        node=Heap.top();
        Heap.pop();
        for(i=0;i<g[node].size();i++)
            if(best[g[node][i].first]>best[node]+g[node][i].second){
                best[g[node][i].first]=best[node]+g[node][i].second;
                Heap.push(g[node][i].first);
            }
    }
}
void Precompute(){
    int i,j;
    for(i=0;i<=people;i++){
        Dijkstra(destination[i]);
        for(j=0;j<=people;j++)
            cost[i][j]=best[destination[j]];;
    }
}
int minimum(int a,int b){
    if(a<b)
        return a;
    return b;
}
int Solve(int i,int j,int start){
    int k;
    if(i>j||(i==j&&i==start))
        return 0;
    if(dp[i][j][start]!=INF)
        return dp[i][j][start];
    for(k=i;k<=j;k++)
        dp[i][j][start]=minimum(dp[i][j][start],Solve(i,k-1,k)+Solve(k+1,j,k)+cost[start][k]);
    return dp[i][j][start];
}
int main(){
    freopen("team.in","r",stdin);
    freopen("team.out","w",stdout);
    int i,j,k,a,b,c;
    scanf("%d%d%d",&people,&vertices,&edges);
    for(i=1;i<=edges;i++){
        scanf("%d%d%d",&a,&b,&c);
        g[a].push_back(make_pair(b,c));
        g[b].push_back(make_pair(a,c));
    }
    destination[0]=1;
    for(i=1;i<=people;i++)
        scanf("%d",&destination[i]);
    Precompute();
    for(i=0;i<=people;i++)
        for(j=0;j<=people;j++)
            for(k=0;k<=people;k++)
                dp[i][j][k]=INF;
    printf("%d",Solve(1,people,0));
    return 0;
}