Cod sursa(job #1894140)

Utilizator marcdariaDaria Marc marcdaria Data 26 februarie 2017 15:35:06
Problema Team Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <fstream>
#include <vector>
#include <queue>
#include <string.h>

using namespace std;

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

using PII=pair<int,int>;
int P,N,M;
vector<PII> G[505];
int d[55][505];
priority_queue<PII> Q;
int D[55];
int minC[55][55][55];

void Read();
void Dijkstra(int p,int x);

int main()
{
    Read();
    Dijkstra(0,1);

    D[0]=1;

    for(int i=1;i<=P;++i)
    {
        fin>>D[i];
        Dijkstra(i,D[i]);
    }

    memset(minC, 0x3f, sizeof(minC));

    for(int s=1;s<=P;++s)
        for(int i=1;i<=P-s+1;++i)
    {
        int j=i+s-1;
        for(int k=0;k<=P;++k)
            for(int l=i;l>=j;++l)
            minC[i][j][k]=min(minC[i][j][k], d[k][D[l]]+(i<=l-1 ? minC[i][l-1][1]:0)+(l+1<=j ? minC[l+1][j][l]:0));
    }

    fout<<minC[1][P][0]<<'\n';

    fin.close();
    fout.close();
    return 0;
}

void Read()
{
    fin>>P>>N>>M;
    for(int i=1;i<=M;++i)
    {
        int x,y,z;
        fin>>x>>y>>z;
        G[x].push_back({y,z});
        G[y].push_back({x,z});
    }
}
void Dijkstra(int p,int x)
{
    memset(d[p], 0x3f, sizeof(d[p]));

    d[p][x]=0;
    Q.push({0,x});

    while(!Q.empty())
    {
        PII pr=Q.top();
        Q.pop();

        if(-pr.first!=d[p][pr.second]) continue;
        for(auto edge : G[pr.second])
            if(-pr.first+edge.second<d[p][edge.first])
        {
            d[p][edge.first]=-pr.first+edge.second;
            Q.push({-d[p][edge.first],edge.first});
        }
    }
}