#include <stdio.h>
#include <string.h>
#include <vector>
using namespace std;
class MaximumCardinalityBipartiteMatching {
private:
vector<bool> visited;
vector<vector<int> > edges;
vector<int> owner;
bool isThereAnAugmentingPathFrom(int leftNode) {
if (visited[leftNode])
return false;
visited[leftNode] = true;
for (int i = 0; i < edges[leftNode].size(); i++) {
int rightNode = edges[leftNode][i];
if (owner[rightNode] == -1 || isThereAnAugmentingPathFrom(owner[rightNode])) {
owner[rightNode] = leftNode;
return true;
}
}
return false;
}
public:
// p_edges is the adjacency matrix, e.g. {{0, 1, 2}, {}, {1, 4, 5}}
// nodes on the left are numbered from 0 to edges.size()-1
// nodes on the right are numbered from 0 to numberOfVerticesOnTheRight
// the adjacency matrix contains only directed edges from left to right set
int getMaximumCardinality(const vector<vector<int> > & p_edges, int numberOfVerticesOnTheRight) {
edges = p_edges;
owner.assign(numberOfVerticesOnTheRight, -1);
int cardinality = 0;
for (int leftNode = 0; leftNode < edges.size(); leftNode++) {
visited.assign(edges.size(), false);
if (isThereAnAugmentingPathFrom(leftNode)) {
cardinality++;
}
}
return cardinality;
}
};
int main() {
int cases;
scanf("%d", &cases);
for (; cases; cases--) {
int cats, dogs, numberOfVoters;
scanf("%d %d %d", &cats, &dogs, &numberOfVoters);
char voter[numberOfVoters][2][5];
vector<vector<int> > edges;
int catLoverCount = 0, dogLoverCount = 0;
int id[numberOfVoters];
for (int v = 0; v < numberOfVoters; v++) {
scanf("%s %s", voter[v][0], voter[v][1]);
bool catLover = voter[v][0][0] == 'C' || voter[v][0][0] == 'c';
if (catLover) {
id[v] = catLoverCount++;
vector<int> emptyVector;
edges.push_back(emptyVector);
} else {
id[v] = dogLoverCount++;
}
for (int j = 0; j < v; j++) {
if (strcmp(voter[j][0], voter[v][1]) == 0 || strcmp(voter[j][1], voter[v][0]) == 0) {
if (catLover)
edges[id[v]].push_back(id[j]);
else
edges[id[j]].push_back(id[v]);
}
}
}
MaximumCardinalityBipartiteMatching mcbm;
int disatifiedVoters = mcbm.getMaximumCardinality(edges, dogLoverCount);
printf("%d\n", numberOfVoters - disatifiedVoters);
}
return 0;
}
Friday, April 24, 2015
UVa 12168 - Cat vs. Dog
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment