Cod sursa(job #2111788)

Utilizator AndreiStanescuAlloys Nokito AndreiStanescu Data 22 ianuarie 2018 18:02:25
Problema Team Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.12 kb
//team-Lot, 2006

#include<bits/stdc++.h>
#define N 55
#define M 512
#define oo 2*1e9
using namespace std;

int n,m,p,X[M],dist[M];
bool viz[M];

vector < pair < int,int > > G[M];

typedef struct Lm{int nod,cost;};

typedef struct cmpdst
{
    bool operator() (Lm x, Lm y)
    {
        return x.cost>y.cost;
    }
};

priority_queue <Lm, vector<Lm>, cmpdst> q;

int cost[N][N][N],dest[M][M];

inline void dijkstra(int S)
{
    int node,co,i;
    memset(viz,0,sizeof(viz));
    for(i=1;i<=n;i++) dist[i]=oo;
    dist[S]=0;
    Lm dg,k;
    dg.nod=S;
    dg.cost=0;
    q.push(dg);
    while(!q.empty())
  {
      node=q.top().nod;
      q.pop();
      if(!viz[node])
      {
          viz[node]=1;
          for(i=0;i<G[node].size();i++)
          {
              dg.nod=G[node][i].first;
              dg.cost=G[node][i].second;
              if(dist[dg.nod]>dist[node]+dg.cost)
              {
                  dist[dg.nod]=dist[node]+dg.cost;
                  k.nod=dg.nod;
                  k.cost=dist[dg.nod];
                  q.push(k);
              }

          }
      }
  }


}

void read()
{
    freopen("team.in","r",stdin);
    scanf("%d%d%d",&p,&n,&m);
    int x,y,c,i,j;
    for(i=1;i<=m;i++)
    {
        scanf("%d%d%d",&x,&y,&c);
        G[x].push_back(make_pair(y,c));
        G[y].push_back(make_pair(x,c));
    }

    for(i=1;i<=p;i++) scanf("%d",&X[i]);
    X[0]=1;

    for(i=0;i<=p;i++)
    {
        dijkstra(X[i]);
        for(j=0;j<=p;j++)
            {dest[i][j]=dist[X[j]];
            //cout<<dest[i][j]<<' ';
            }
            //cout<<endl;

    }

}


int get_cost(int i, int j, int k)
{
    if(i>j) return 0;
    if(cost[i][j][k]>=0) return cost[i][j][k];
    if(i==j && j==k) return 0;

    cost[i][j][k]=oo;

    for(int u=i;u<=j;u++)
        cost[i][j][k]=min( cost[i][j][k], dest[k][u] +get_cost(i,u-1,u)+get_cost(u+1,j,u) );

    return cost[i][j][k];
}


int main()
{
    read();
    memset(cost,255,sizeof(cost));
    freopen("team.out","w",stdout);
    cout<<get_cost(1,p,0);

}