Cod sursa(job #2294791)

Utilizator usureluflorianUsurelu Florian-Robert usureluflorian Data 2 decembrie 2018 20:01:36
Problema Team Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.9 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f ("team.in");
ofstream g ("team.out");
vector <pair<int,int> > v[1003];
int dist[1003][1003],n,jos[1003];
typedef struct usu
{
    int nod,cost;
    bool operator<(const usu& t) const
    {
        return cost>t.cost;
    }
};
priority_queue <usu> q;
void solve(int bos)
{
    for(int i=1;i<=n;++i)
    {
        dist[jos[bos]][i]=1e9;
        q.push({i,1e9});
    }
    dist[jos[bos]][jos[bos]]=0;
    q.push({jos[bos],0});
    while(!q.empty())
    {
        int nod=q.top().nod;
        int cost=q.top().cost;
        q.pop();
        if(cost>dist[jos[bos]][nod]) continue;
        for(vector <pair <int,int> >::iterator it=v[nod].begin();it!=v[nod].end();++it)
        {
            if(cost+it->second<dist[jos[bos]][it->first])
            {
                dist[jos[bos]][it->first]=cost+it->second;
                q.push({it->first,dist[jos[bos]][it->first]});
            }
        }
    }
}
int p,m,x,y,c,dp[53][53][53];
int main()
{
    f>>p>>n>>m;
    for(int i=1;i<=m;++i)
    {
        f>>x>>y>>c;
        v[x].push_back({y,c});
        v[y].push_back({x,c});
    }
    for(int i=1;i<=p;++i) f>>jos[i];
    jos[0]=1;
    for(int i=0;i<=p;++i) solve(i);
    for(int i=0;i<=p;++i)
    {
        for(int j=0;j<=p;++j)
        {
            for(int k=0;k<=p;++k)
            {
                dp[i][j][k]=1e9;
                if(i>j) dp[i][j][k]=0;
            }
        }
    }
    for(int i=0;i<=p;++i) dp[i][i][i]=0;
    for(int l=1;l<=p;++l)
    {
        for(int i=1;(i+l-1)<=p;++i)
        {
            int j=i+l-1;
            for(int k=0;k<=p;++k)
            {
                if(i==j&&i==k) continue;
                for(int t=i;t<=j;++t) dp[i][j][k]=min(dp[i][j][k],dp[i][t-1][t]+dp[t+1][j][t]+dist[jos[k]][jos[t]]);
            }
        }
    }
    g<<dp[1][p][0];
    return 0;
}