Cod sursa(job #1787823)

Utilizator LucianTLucian Trepteanu LucianT Data 25 octombrie 2016 08:15:49
Problema Team Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <bits/stdc++.h>
#define INF (1<<30)
#define maxN 505
#define maxP 52
#define pii pair<int,int>
using namespace std;
vector<pair<int,int> >v[maxN];
int dist[maxN][maxN];
int dp[maxP][maxP][maxN];
int n,m,p,i,j,k,x,y,z,loc[maxN];
priority_queue<pii,vector<pii>,greater<pii> >Heap;
void dijkstra(int start)
{
    int i;
    for(i=1;i<=n;i++)
        dist[start][i]=INF;
    dist[start][start]=0;
    Heap.push(make_pair(0,start));
    while(!Heap.empty())
    {
        int nod=Heap.top().second;
        int cost=Heap.top().first;
        Heap.pop();
        if(dist[start][nod]!=cost)
            continue;
        for(vector<pii>::iterator it=v[nod].begin();it!=v[nod].end();it++)
            if(dist[start][it->first]>dist[start][nod]+it->second)
                dist[start][it->first]=dist[start][nod]+it->second,
                Heap.push(make_pair(dist[start][it->first],it->first));
    }
}
int memo(int st,int dr,int nod)
{
    if(st>dr)
        return 0;
    if(dp[st][dr][nod]!=INF)
        return dp[st][dr][nod];
    for(int i=st;i<=dr;i++)
        dp[st][dr][nod]=min(dp[st][dr][nod],memo(st,i-1,loc[i])+memo(i+1,dr,loc[i])+dist[loc[i]][nod]);
    return dp[st][dr][nod];
}
int main()
{
    freopen("team.in","r",stdin);
    freopen("team.out","w",stdout);
    scanf("%d %d %d",&p,&n,&m);
    for(i=1;i<=p;i++)
        for(j=1;j<=p;j++)
            for(k=1;k<=n;k++)
                dp[i][j][k]=INF;
    for(i=1;i<=m;i++)
        scanf("%d %d %d",&x,&y,&z),
        v[x].push_back(make_pair(y,z)),
        v[y].push_back(make_pair(x,z));
    for(i=1;i<=p;i++)
        scanf("%d",&loc[i]),
        dijkstra(loc[i]),
        dp[i][i][loc[i]]=0;
    printf("%d",memo(1,p,1));
    return 0;
}