Cod sursa(job #1204215)

Utilizator danalex97Dan H Alexandru danalex97 Data 2 iulie 2014 12:52:20
Problema Team Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <fstream>
#include <queue>
using namespace std;

ifstream F("team.in");
ofstream G("team.out");

const int N = 510;
const int M = 55;

int n,m,mm;
int d[M][M][M],dst[N];
vector< pair<int,int> > v[N];
int cst[M][N];

void bellman(int x,int n)
{
    priority_queue< pair<int,int> > q;
    q.push( make_pair(-0,n) );
    while ( !q.empty() )
    {
        int n = q.top().second;
        q.pop();
        for (size_t i=0;i<v[n].size();++i)
        {
            int nn = v[n][i].first;
            int cc = v[n][i].second;
            if ( cst[x][nn] > cst[x][n] + cc )
            {
                cst[x][nn] = cst[x][n] + cc;
                q.push( make_pair(-cst[x][nn],nn) );
            }
        }
    }
}

int main()
{
    F>>m>>n>>mm;
    for (int i=1,x,y,c;i<=mm;++i)
    {
        F>>x>>y>>c;
        v[x].push_back(make_pair(y,c));
        v[y].push_back(make_pair(x,c));
    }
    for (int i=1;i<=m;++i)
        F>>dst[i];
    dst[0] = 1;
    for (int i=0;i<=m;++i)
    {
        for (int j=1;j<=n;++j)
            cst[i][j] = 1<<29;
        cst[i][dst[i]] = 0;
        bellman(i,dst[i]);
    }
    for (int j=1;j<=m;++j)
        for (int i=j;i>=1;--i)
            for (int ds=0;ds<=m;++ds)
            {
                d[i][j][ds] = 1<<29;
                for (int l=i;l<=j;++l)
                {
                    int act = 0;
                    if ( i <= l-1 ) act += d[i][l-1][l];
                    if ( l+1 <= j ) act += d[l+1][j][l];
                    act += cst[ds][dst[l]];
                    d[i][j][ds] = min(d[i][j][ds],act);
                }
            }
    G<<d[1][m][0]<<'\n';
}