Cod sursa(job #731969)

Utilizator dushmiMihai-Alexandru Dusmanu dushmi Data 9 aprilie 2012 14:51:01
Problema Team Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>

using namespace std;

const int P = 55, N = 505, INF = 100 * 100 * 100 * 100;

int p, n, poz[P], dc[N], dist[P][P], d[P][P][P];

vector <pair <int, int> > L[N];

struct comp {
  bool operator() (const int &a, const int &b) {
    return d[a] < d[b];
  }
};

priority_queue <int, vector <int>, comp> Q;

void read() {
  int m, x, y, c;

  scanf("%d%d%d", &p, &n, &m);

  for (int i = 1; i <= m; ++i) {
    scanf("%d%d%d", &x, &y, &c);
    L[x].push_back(make_pair(y, c));
    L[y].push_back(make_pair(x, c));
  }

  for (int i = 1; i <= p; ++i)
    scanf("%d", &poz[i]);
}

inline int min(int x, int y) {
  return x < y ? x : y;
}

void BF(int nod, int pc) {
  bool inq[N];

  for (int i = 0; i < N; ++i)
    dc[i] = INF;
  memset(inq, 0, sizeof(inq));
  
  dc[nod] = 0;
  Q.push(nod);
  inq[nod] = 1;

  while (!Q.empty()) {
    int nc = Q.top(); inq[nc] = 0; Q.pop();

    for (int i = 0; i < (int)L[nc].size(); ++i)
      if (L[nc][i].second + dc[nc] < dc[L[nc][i].first]) {
        dc[L[nc][i].first] = dc[nc] + L[nc][i].second;
        if (!inq[L[nc][i].first])
          Q.push(L[nc][i].first);
      }
  }

  for (int i = 0; i <= p; ++i)
    dist[pc][i] = dc[poz[i]];
}

void init() {
  poz[0] = 1;
  for (int i = 0; i <= p; ++i)
    BF(poz[i], i);
}

int solve(int l, int r, int nod) {
  if (l > r)
    return 0;

  if (d[l][r][nod] != INF)
    return d[l][r][nod];

  for (int i = l; i <= r; ++i)
    d[l][r][nod] = min(d[l][r][nod], solve(l, i - 1, i) + solve(i + 1, r, i) + dist[nod][i]);

  return d[l][r][nod];
}

int main() {
  freopen("team.in", "r", stdin);
  freopen("team.out", "w", stdout);

  read();

  init();

  for (int i = 0; i < P; ++i)
    for (int j = 0; j < P; ++j)
      for (int k = 0; k < P; ++k)
        d[i][j][k] = INF;

  printf("%d\n", solve(1, p, 0));

  return 0;
}