Cod sursa(job #358102)

Utilizator vlad_DVlad Dumitriu vlad_D Data 21 octombrie 2009 21:12:12
Problema A+B Scor 0
Compilator cpp Status done
Runda Lista lui wefgef Marime 1.47 kb
#include <cstdio>
#include <iostream>
#include <vector>

using namespace std;
void solve();
int main() {
  int t;
  scanf("%d\n", &t);
  while (t--) {
    solve();
  }
  return 0;
}
int N;
vector<vector<int> > G;
int lleft[30];
int graf[33];
void dfs(int nod) {
  ++N; graf[N-1] = nod; lleft[nod] = 0;
  for (int i = 0; i < G[nod].size(); ++i) if (lleft[G[nod][i]]) {
    dfs(G[nod][i]);
  }
}
int compute();

void solve() {
  int m;
  scanf("%d", &m);
  G.clear(); G.resize(30);
  memset(lleft, 0, sizeof(lleft)); 
  
  while (m--) {
    char a, b;
    cin >> a >> b;
    lleft[a-'A'] = lleft[b-'A'] = 1;
    G[a-'A'].push_back(b-'A');
    G[b-'A'].push_back(a-'A');
  }
  //solve for subcomponents
  int total = 0;
  for (int i = 0; i < 30; ++i) if (lleft[i]) {
    N = 0;
    dfs(i);
    //am un graf
    total += compute();
  }

  printf("%d\n", total * 100);

}
int masks[30];
int invers[30];
int best;
void back(int mask, int steps, int k) {
  if (k >= N) return;
  if (steps >= best) return;
  if (mask == (1 << N) - 1) {best=steps; return;}
  //use k or not
  back(mask | masks[k], steps+1, k+1);
  back(mask, steps, k+1);
}
int compute() {
  if (N == 2) return 1;
  if (N == 3) return 1;
  //build the masks
  for (int i = 0; i < N; ++i) invers[graf[i]] = i;
  for (int i = 0; i < N; ++i) {
    masks[i] = (1 << i);
    for (int j = 0; j < G[graf[i]].size(); ++j) {
      masks[i] |= (1 << invers[G[graf[i]][j]]);
    }
  }
  //done the masks?
  best = (N + 1)/2;
  back(0, 0, 0);
  return best;
}