Cod sursa(job #1036408)

Utilizator geniucosOncescu Costin geniucos Data 19 noiembrie 2013 12:47:10
Problema Team Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include<cstdio>
using namespace std;
int pers,i,j,k,n,m,x1,y11,nd[503],dp[53][53][503],rf[503][503];
void RoyFloyd()
{
    int i,j,k;
    for(k=1;k<=n;k++)
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
                if(rf[i][k]+rf[k][j]<rf[i][j]) rf[i][j]=rf[i][k]+rf[k][j];
}
int calc(int st,int dr,int nod)
{
    if(st>dr) return 0;
    if(st==dr) return rf[nod][nd[st]];
    if(dp[st][dr][nod]!=-1) return dp[st][dr][nod];
    int i,val;
    dp[st][dr][nod]=10000000;
    for(i=st;i<=dr;i++)
    {
        val=calc(st,i-1,nd[i])+rf[nod][nd[i]]+calc(i+1,dr,nd[i]);
        if(val<dp[st][dr][nod]) dp[st][dr][nod]=val;
    }
    return dp[st][dr][nod];
}
int main()
{
freopen("team.in","r",stdin);
freopen("team.out","w",stdout);
scanf("%d",&pers);
scanf("%d",&n);
scanf("%d",&m);
for(i=1;i<=n;i++)
    for(j=1;j<=n;j++)
        if(i!=j) rf[i][j]=1000000;
for(i=1;i<=pers;i++)
    for(j=i;j<=pers;j++)
        for(k=1;k<=n;k++)
            dp[i][j][k]=-1;
for(i=1;i<=m;i++)
{
    scanf("%d",&x1);
    scanf("%d",&y11);
    scanf("%d",&rf[y11][x1]);
    rf[x1][y11]=rf[y11][x1];
}
for(i=1;i<=n;i++)
    scanf("%d",&nd[i]);
RoyFloyd();
printf("%d\n",calc(1,pers,1));
return 0;
}