Pagini recente » Cod sursa (job #445455) | Cod sursa (job #921863) | Cod sursa (job #2836427) | Cod sursa (job #2330329) | Cod sursa (job #358102)
Cod sursa(job #358102)
#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;
}