Monday, January 9, 2017

UVa 599 - The Forrest for the Trees

//UVa 599 - The Forrest for the Trees

#include <iostream>
#include <string>

using namespace std;

int count(char node, bool edge[26][26], bool visited[26]) {
	visited[node] = true;
	int c = 1;
	for (char neighbor = 0; neighbor < 26; neighbor++)
		if (!visited[neighbor] && edge[node][neighbor]) {
			c += count(neighbor, edge, visited);
		}
	return c;
}

int main() {

	int cases;
	for (cin >> cases; cases; cases--) {
		string line;
		bool edge[26][26] = { false };
		for (cin >> line; line[0] != '*'; cin >> line) {
			char a = line[1] - 'A', b = line[3] - 'A';
			edge[a][b] = true;
			edge[b][a] = true;
		}
		string nodes;
		cin >> nodes;

		int acorns = 0, trees = 0;
		bool visited[26] = { false };
		for (int i = 0; i < nodes.length(); i++) {
			if (nodes[i] < 'A' || nodes[i] > 'Z')
				continue;
			char node = nodes[i] - 'A';
			if (visited[node])
				continue;
			if (count(node, edge, visited) == 1)
				acorns++;
			else
				trees++;
		}

		cout << "There are " << trees << " tree(s) and " << acorns << " acorn(s)." << endl;
	}

	return 0;
}

No comments:

Post a Comment