Cod sursa(job #551945)

Utilizator eudanipEugenie Daniel Posdarascu eudanip Data 11 martie 2011 13:08:26
Problema Team Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.16 kb
#include<stdio.h>
#include<string.h>
#include<set>
#include<vector>
using namespace std;

#define pb push_back
#define minim(a,b) (a<b ? a : b)
#define INF 1000000000

set<int> myset;
set<int> ::iterator it;

vector<int> v[505],cost[505];
int p,n,m,nr;
int d[53][53][53];
int dist[505][505];
int go[53],final[53];
int surse[53],uz[505];

void dijkstra(int nod)
{
    int i,j,lim;
    memset(uz,0,sizeof(uz));
    for(i=0;i<=n;i++)
        dist[nod][i]=INF;
    dist[nod][nod]=0;
    for(i=1;i<n;i++)
    {
        int s=0;
        for(j=1;j<=n;j++)
            if (!uz[j] && dist[nod][s]>dist[nod][j])
                s=j;
        uz[s]=1;
        lim=v[s].size();
        for(j=0;j<lim;j++)
            dist[nod][v[s][j]]=minim(dist[nod][v[s][j]],
                                cost[s][j]+dist[nod][s]);
    }
}

int main ()
{
    int i,j,k,l,t,a,b,c,cst;
    
    freopen("team.in","r",stdin);
    freopen("team.out","w",stdout);
    scanf("%d%d%d",&p,&n,&m);
    for(i=1;i<=m;i++)
    {
        scanf("%d%d%d",&a,&b,&c);
        v[a].pb(b);
        cost[a].pb(c);
        v[b].pb(a);
        cost[b].pb(c);
    }
    for(i=1;i<=p;i++)
    {
        scanf("%d",&final[i]);
        myset.insert(final[i]);
    }
    myset.insert(1);
    for(it=myset.begin();it!=myset.end();it++)
        surse[++nr]=*it;
    for(i=1;i<=nr;i++)
        dijkstra(surse[i]);
        
    for(i=1;i<=p;i++)
        for(j=1;j<=nr;j++)
            if(final[i]==surse[j])
            {
                go[i]=j;
                break;
            }

    for(l=1;l<=p;l++)
        for(j=1;j<=p-l+1;j++)
        {
            k=j+l-1;
            for (i=1;i<=nr;i++)
            {
                d[i][j][k]=INF;
                for(t=j;t<=k;t++)
                {
                    cst=dist[final[t]][surse[i]];
                    if(t>j)
                        cst+=d[go[t]][j][t-1];
                    if(t<k)
                        cst+=d[go[t]][t+1][k];

                    d[i][j][k]=minim(d[i][j][k],cst);
                }                
            }
        }
    printf("%d\n",d[1][1][p]);
       
    return 0;
}