Cod sursa(job #1173382)

Utilizator Impaler_009Mihai Nitu Impaler_009 Data 19 aprilie 2014 15:26:44
Problema Team Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.2 kb
#include <fstream>
#include <vector>
#include <queue>
#include <utility>

#define inf 1000000000
#define vintp vector<pair<int,int> >::iterator

using namespace std;

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

int n,p,m,a,b,c,ans;
int dest[51],d[501];
vector<pair<int,int > >G[501];
priority_queue <pair<int,int>, vector<pair<int,int> >,greater <pair<int,int> > > H;
int C[51][51],C1[51];
int dp[51][51][51];

void dijkstra (int x, int wh)
{
    for (int i=1; i<=n; ++i)
        d[i] = inf;
    d[x] = 0;
    H.push (make_pair(0,x));

    while (!H.empty ())
    {
        pair<int,int> a = H.top ();
        H.pop ();

        if (a.first != d[a.second])
            continue;
        int x = a.second;

        for (vintp it = G[x].begin (); it != G[x].end(); ++it)
        {
            if (d[x] + it->second < d[it->first])
            {
                d[it->first] = d[x] + it->second;
                H.push (make_pair (d[it->first],it->first));
            }
        }
    }

    for (int i=1; i<=p; ++i)
    {
        C[wh][i] = d[dest[i]];
    }

    C1[wh] = d[1];
}

int main()
{
    fin>>p>>n>>m;

    for (int i=1; i<=m; ++i)
    {
        fin>>a>>b>>c;
        G[a].push_back (make_pair(b,c));
        G[b].push_back (make_pair(a,c));
    }

    for (int i=1; i<=p; ++i)
    {
        fin>>dest[i];
    }

    for (int i=1; i<=p; ++i)
        dijkstra(dest[i],i);

    for (int i=1; i <= p; ++i)
        for (int j=1; j <= p; ++j)
        dp[i][i][j] = C[i][j];

    for (int i=1; i<p; ++i)
    {
        for (int j=1; j+i <=p; ++j)
        {
            int ii = j, jj = i+j;

            for (int k=1; k<=p; ++k)
            {
                dp[ii][jj][k] = min (C[k][ii] + dp[ii+1][jj][ii], C[k][jj] + dp[ii][jj-1][jj]);

                for (int h=ii+1; h <jj; ++h)
                {
                    dp[ii][jj][k] = min (dp[ii][jj][k], C[k][h] + dp[ii][h-1][h] + dp[ii][h+1][h]);
                }
            }
        }
    }

    ans = min (C1[1] + dp[2][p][1], C1[p] + dp[1][p-1][p]);

    for (int i=1; i<=p; ++i)
    {
        ans = min (ans,C1[i] + dp[1][i-1][i] + dp[i+1][p][i]);
    }

    fout<<ans;
}