Tuesday, April 21, 2015

UVa 11045 - My T-shirt suits me

// UVa 11045 - My T-shirt suits me

#include <map>
#include <stdio.h>
#include <string>
#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:
	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() {

	map<string, int> sizes;
	sizes["XXL"] = 0;
	sizes["XL"] = 1;
	sizes["L"] = 2;
	sizes["M"] = 3;
	sizes["S"] = 4;
	sizes["XS"] = 5;

	int cases;
	scanf("%d", &cases);
	for (; cases; cases--) {

		int numberOfTshirts, numberOfVolunteers;
		scanf("%d %d", &numberOfTshirts, &numberOfVolunteers);
		int numberOfTshirtsPerSize = numberOfTshirts / 6;
		vector<vector<int> > edges(numberOfTshirts);

		for (int volunteer = 0; volunteer < numberOfVolunteers; volunteer++) {
			char size1[4], size2[4];
			scanf("%s %s", size1, size2);

			int start = sizes[size1] * numberOfTshirtsPerSize;
			int end = start + numberOfTshirtsPerSize;
			for (int tshirt = start; tshirt < end; tshirt++) {
				edges[tshirt].push_back(volunteer);
			}
			start = sizes[size2] * numberOfTshirtsPerSize;
			end = start + numberOfTshirtsPerSize;
			for (int tshirt = start; tshirt < end; tshirt++) {
				edges[tshirt].push_back(volunteer);
			}
		}

		MaximumCardinalityBipartiteMatching mcbm;
		bool canCoverAllVolunteers = mcbm.getMaximumCardinality(edges, numberOfVolunteers) == numberOfVolunteers;
		printf(canCoverAllVolunteers ? "YES\n" : "NO\n");
	}
	return 0;
}

No comments:

Post a Comment