Cod sursa(job #1036428)

Utilizator geniucosOncescu Costin geniucos Data 19 noiembrie 2013 13:00:41
Problema Team Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include<cstdio>
using namespace std;
int ul,pers,i,j,k,n,m,x1,y11,nd[503],dp[53][53][503],cst[503][503],D[53][503],ap[503];
void Dijkstra(int nod,int d[])
{
    int i,mini;
    for(i=1;i<=n;i++)
    {
        d[i]=10000000;
        ap[i]=0;
    }
    d[nod]=0;
    ul=nod;
    ap[nod]=1;
    while(1)
    {
        for(i=1;i<=n;i++)
            if(d[ul]+cst[ul][i]<d[i]) d[i]=d[ul]+cst[ul][i];
        mini=10000000;
        for(i=1;i<=n;i++)
            if(d[i]<mini&&ap[i]==0)
            {
                mini=d[i];
                ul=i;
            }
        if(mini==10000000) break;
        ap[ul]=1;
    }
}
int calc(int st,int dr,int nod)
{
    if(st>dr) return 0;
    if(st==dr) return D[st][nod];
    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])+D[i][nod]+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) cst[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",&cst[y11][x1]);
    cst[x1][y11]=cst[y11][x1];
}
for(i=1;i<=n;i++)
    scanf("%d",&nd[i]);
for(i=1;i<=n;i++)
    Dijkstra(nd[i],D[i]);
printf("%d\n",calc(1,pers,1));
return 0;
}