Cod sursa(job #1593890)

Utilizator patrutoiuandreipatrutoiu andrei patrutoiuandrei Data 8 februarie 2016 22:56:50
Problema Team Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.15 kb
#include <fstream>
#include <vector>
#include <queue>
#include <string.h>

#define Ndim 503
#define Pdim 53
#define INF 0x3f3f3f3f
#define pb push_back
#define mkp make_pair
using namespace std;
ifstream fin("team.in");
ofstream fout("team.out");
int N,M,P,BST[Pdim][Pdim][Pdim],dist[Pdim][Pdim],Ldrum[Ndim];
short int dest[Pdim];
vector <pair <int,int> > G[Ndim];
void read()
{
    int i,a,b,c;
    fin>>P>>N>>M;
    for(i=1;i<=M;i++)
    {
        fin>>a>>b>>c;
        G[a].pb(mkp(b,c));
        G[b].pb(mkp(a,c));
    }
    for(i=1;i<=P;i++)
        fin>>dest[i];
    dest[P+1] = 1;
}
void dijkstra(int start)
{
    int newnode,newcost;
    memset(Ldrum,INF,sizeof(Ldrum));
    priority_queue < pair<int,int> > Q;
    Q.push(mkp(0,start));
    Ldrum[start] = 0;
    while(!Q.empty())
    {
        int node = Q.top().second, cost = -Q.top().first;
        Q.pop();
        if (Ldrum[node] != cost)
            continue;
        for(size_t i = 0;i<G[node].size();i++)
        {
            newnode = G[node][i].first;
            newcost = G[node][i].second;
            if(Ldrum[newnode] > cost + newcost)
            {
                Ldrum[newnode] = cost + newcost;
                Q.push(mkp(-Ldrum[newnode],newnode));
            }
        }
    }
}
void prep()
{
    int i,j;
    for(i=1;i<=P+1;i++)
    {
        dijkstra(dest[i]);
        for(j=1;j<=P+1;j++)
        {
            dist[i][j] = Ldrum[dest[j]];
        }
    }
}
void solve()
{
    int len,left,right,i,place;
    for(len = 1; len <= P; len++)
    {
        for(left = 1;left + len -1 <= P+1; left++)
        {
            right = left + len - 1;
            for(place = 1; place <= P+1; ++place)
            {
                BST[left][right][place] = INF;
                for(i=left;i<=right;i++)
                {
                    BST[left][right][place] = min (BST[left][right][place], dist[place][i] + BST[left][i-1][i] + BST[i+1][right][i]);
                }
            }
        }
    }
}
void print()
{
    fout<<BST[1][P][P+1];
}
int main()
{
    read();
    prep();
    solve();
    print();
    return 0;
}