Cod sursa(job #1173975)

Utilizator Kira96Denis Mita Kira96 Data 21 aprilie 2014 15:20:17
Problema Team Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include<fstream>
#define inf 0x3f3f3f
#include<cstring>
#define NM 510
#define PM 55
#define FOR(a,b,c) for(int a=b;a<=c;++a)
#define ROF(a,b,c) for(int a=b;a>=c;--a)
using namespace std;
ifstream f("team.in");
ofstream g("team.out");
int dp[PM][PM][PM],P[PM][PM],C[NM][NM],X[NM],viz[NM],n,x,y,p,m,D[PM],c;
void dijkstra(int x)
{
    memset(X,inf,sizeof(X));
    memset(viz,0,sizeof(viz));
    X[x]=0;
    FOR(i,1,n)
    {
        int bj=0;
        FOR(j,1,n)
        if(!viz[j]&&X[j]<X[bj]) bj=j;

        FOR(j,1,n)
        if(X[bj]+C[bj][j]<X[j]) X[j]=X[bj]+C[bj][j];

        viz[bj]=1;
    }
}
int find(int dest,int fr,int sc)
{
    if(fr>sc)
    return 0;

    if(dp[dest][fr][sc]>=0)
    return dp[dest][fr][sc];

    if(dest==fr&&sc==fr)
        return 0;

    dp[dest][fr][sc]=inf;

    FOR(j,fr,sc)
    dp[dest][fr][sc]=min(dp[dest][fr][sc],find(j,j+1,sc)+P[dest][j]+find(j,fr,j-1));

    return dp[dest][fr][sc];
}
int main ()
{
    f>>p>>n>>m;
    memset(C,inf,sizeof(C));
    FOR(i,1,m)
    {
        f>>x>>y>>c;
        C[x][y]=C[y][x]=c;
    }
    FOR(i,1,p)
    f>>D[i];
    D[0]=1;
    FOR(i,0,p)
    {
        dijkstra(D[i]);
        FOR(j,0,p)
        P[i][j]=X[D[j]];
    }
    memset(dp,-1,sizeof(dp));
    g<<find(0,1,p);
    return 0;
}