Cod sursa(job #998533)

Utilizator misinoonisim necula misino Data 17 septembrie 2013 15:37:24
Problema Team Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 kb
#include<fstream>
#include<cstdio>
#define P 55
#define N 505
#define INF 999999999
using namespace std;
int i,n,m,p,j,k,cost,x,y,sol[P][P][N],c[P][N],d[P],viz[N],a[N][N];
inline void dijkstra(int s,int d[])
{
    int mini,p;
    for(int i=1;i<=n;++i)
    {
        d[i]=INF;
        viz[i]=0;
    }
    d[s]=0;
    while(1)
    {
        mini=INF;
        for(int i=1;i<=n;++i)
            if(mini>d[i]&&!viz[i])
            {
                mini=d[i];
                p=i;
            }
        if(mini==INF)
        {
            return;
        }
        viz[p]=1;
        for(int i=1;i<=n;++i)
            if(d[i]>d[p]+a[p][i])
            {
                d[i]=d[p]+a[p][i];
            }
    }
}
inline int rez(int li,int ls,int x)
{
    if(li>ls)
        return 0;
    if(li==ls)
        return c[li][x];
    if(sol[li][ls][x]!=-1)
        return sol[li][ls][x];
    int mini=INF;
    for(int i=li;i<=ls;++i)
    {
        mini=min(mini,c[i][x]+rez(li,i-1,d[i])+rez(i+1,ls,d[i]));
    }
    return mini;
}
int main()
{
    freopen("team.in","r",stdin);
    freopen("team.out","w",stdout);
    scanf("%d%d%d",&p,&n,&m);
    for(i=1;i<=n;++i)
        for(j=1;j<=n;++j)
            a[i][j]=INF;
    for(i=1;i<=n;++i)
        a[i][i]=0;
    for(i=1;i<=m;++i)
    {
        scanf("%d%d%d",&x,&y,&cost);
        a[x][y]=a[y][x]=cost;
    }
    for(i=1;i<=p;++i)
    {
        scanf("%d",&d[i]);
        dijkstra(d[i],c[i]);
    }
    for(i=1;i<=p;++i)
        for(j=i;j<=p;++j)
            for(k=1;k<=n;++k)
            {
                sol[i][j][k]=-1;
            }
    printf("%d\n",rez(1,p,1));
    return 0;
}