Cod sursa(job #2020982)

Utilizator cella.florescuCella Florescu cella.florescu Data 12 septembrie 2017 14:55:21
Problema Bibel Scor 85
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.05 kb
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 17;
const int INF = 2e9;

int dp[1 << MAXN][MAXN];
vector <pair <int, int>> v, w;

inline int dst(pair <int, int> A, pair <int, int> B) {
  return (A.first - B.first) * (A.first - B.first) + (A.second - B.second) * (A.second - B.second);
}

int main()
{
    int stp = 1, test = 0, lstn, lstans;
    FILE *fin = fopen("bibel.in", "r"), *fout = fopen("bibel.out", "w");
    fscanf(fin, "%d", &stp);
    v.resize(MAXN);
    w.resize(MAXN);
    while (stp != 2) {
      ++test;
      int x, y, n = 0;
      while (stp == 0) {
        fscanf(fin, "%d%d%d", &x, &y, &stp);
        v[n++] = make_pair(x, y);
      }
      if (test == 1) {
        for (int conf = 0; conf < (1 << n); ++conf)
          for (int i = 0; i < n; ++i)
            dp[conf][i] = INF;
        for (int i = 0; i < n; ++i)
          dp[1 << i][i] = dst(v[i], make_pair(0, 0));
      } else {
        for (int i = 0; i < n; ++i) {
          dp[1 << i][i] = INF;
          for (int j = 0; j < lstn; ++j)
            dp[1 << i][i] = min(dp[1 << i][i], dp[(1 << lstn) - 1][j] + dst(w[j], v[i]));
        }
        for (int conf = 0; conf < n; ++conf)
          if (conf & (conf - 1))
            for (int i = 0; i < n; ++i)
              dp[conf][i] = INF;
      }
      for (int conf = 3; conf < (1 << n); ++conf)
        if (conf & (conf - 1))
          for (int i = 0; i < n; ++i)
            if ((1 << i) & conf) {
              int mini = INF;
              for (int j = 0; j < n; ++j)
                if (i != j && (conf & (1 << j)))
                  mini = min(mini, dp[conf ^ (1 << i)][j] + dst(v[i], v[j]));
              dp[conf][i] = mini;
            }
      int ans = INF;
      for (int i = 0; i < n; ++i)
        ans = min(ans, dp[(1 << n) - 1][i]);
      if (n == 0)
        ans = lstans;
      else {
        w = v;
        lstn = n;
        lstans = ans;
      }
      fprintf(fout, "%d\n", ans);
      fscanf(fin, "%d", &stp);
    }
    fclose(fin);
    fclose(fout);
    return 0;
}