Cod sursa(job #2015133)

Utilizator ionanghelinaIonut Anghelina ionanghelina Data 25 august 2017 02:38:13
Problema Team Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.1 kb
#include<bits/stdc++.h>
#define maxN 1005
#define inf 2000000
#define maxP 55
using namespace std;
vector<pair<int,int> > v[maxN];
int dist[maxN][maxN],n,stop[maxN];
typedef struct tip
{
    int nod,cost;
    bool operator<(const tip& other) const
    {
        return cost>other.cost;
    }
};
priority_queue<tip> q;
inline void RunDijkstra(int node)
{
    for(int i=1;i<=n;i++)
    {
        dist[stop[node]][i]=inf;
        q.push({i,inf});
    }
    dist[stop[node]][stop[node]]=0;
    q.push({stop[node],0});
    while(!q.empty())
    {
        int nod=q.top().nod;
        int cost=q.top().cost;
        q.pop();
        if(cost>dist[stop[node]][nod]) continue;
        for(vector<pair<int,int> >::iterator it=v[nod].begin();it!=v[nod].end();it++)
        {
            if(cost+it->second<dist[stop[node]][it->first])
            {
                dist[stop[node]][it->first]=cost+it->second;
                q.push({it->first,dist[stop[node]][it->first]});
            }
        }
    }
}
int p,m,x,y,c,dp[maxP][maxP][maxP];
int main()
{
    freopen("team.in","r",stdin);
    freopen("team.out","w",stdout);
    scanf("%d",&p);
    scanf("%d",&n);
    scanf("%d",&m);
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&x,&y,&c);
        v[x].push_back({y,c});
        v[y].push_back({x,c});
    }
    for(int i=1;i<=p;i++)
        scanf("%d",&stop[i]);
    stop[0]=1;
    for(int i=0;i<=p;i++)
        RunDijkstra(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]=inf;
                if(i>j) dp[i][j][k]=0;
        }
    for(int i=0;i<=p;i++)
        dp[i][i][i]=0;
    for(int len=1;len<=p;len++)
        for(int i=1;(i+len-1)<=p;i++)
        {
            int j=i+len-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[stop[k]][stop[t]]);
            }
        }
    printf("%d\n",dp[1][p][0]);
    return 0;
}