Hihocoder - 15주 LCA

5427 단어 code
#include <iostream>
#include <string>
#include <map>
#include <stack>
#include <vector>

using namespace std;

map<string, string> represent;
map<pair<string, string>, string> ans;
pair<string, string> a[100005];

string find_represent(string x){
    if (x == represent[x])
        return x;
    else{
        represent[x] = find_represent(represent[x]);
        return represent[x];
    }
}

void unionset(string x, string y){
    represent[find_represent(x)] = find_represent(y);
}

template <class T>
class Node{
/*
 *  This is a Tree Node class.
*/
    public:
        T field, parent;
        vector<T> son;
		vector<T> query;
		string color;

        Node(T myfield){
            field = myfield;
            son.clear();
			query.clear();
            parent = "";
			color = "white";
        }

		void add_query(T query_name){
			query.push_back(query_name);
		}

        void add_child(T child){
            son.push_back(child);
        }

        void set_parent(T sparent){
            parent = sparent;
        }
};

template <class T>
class GenTree{
    public:
        Node<T> *root;
        map<T, Node<T>* > nodes;

		GenTree(){}

        GenTree(T root_field){
            root = new Node<T>(root_field);
            root->parent = root_field;
            nodes.insert(pair<T, Node<T>* >(root_field, root));
        }

        Node<T>* add_node(T field, T parent = ""){
            Node<T> *node = new Node<T>(field);

            nodes[field] = node;
            if (parent!= ""){
                nodes[parent]->add_child(field);
                node->parent = parent;
            }
			else
				node->parent = field;

            return node;
        }

		void add_query(T field, T query_name){
			nodes[field]->add_query(query_name);
			nodes[query_name]->add_query(field);
		}

        void traverse(T field){
            stack<T> mystack;
            T temp_field;

			mystack.push(field);
            while (!mystack.empty()){
                temp_field = mystack.top();
                mystack.pop();
                cout<<temp_field<<endl;
				if (nodes[temp_field]->son.size() != 0){
					int size = 	nodes[temp_field]->son.size();
					for (int i=size-1; i>=0; i--)
						mystack.push(nodes[temp_field]->son[i]);
				}
				cout<<temp_field<<endl;
            }
        }

		void dfs(T field){
			int n = nodes[field]->son.size();
			int size = nodes[field]->query.size();
			string query_name, color, temp_name1, temp_name2;

			nodes[field]->color = "grey";
			if (size != 0){
				for (int i=0; i<size; i++){
					temp_name1 = nodes[field]->query[i];
					color = nodes[temp_name1]->color;
					if (color == "grey"){
						ans[pair<string, string>(field, temp_name1)] = temp_name1;
						ans[pair<string, string>(temp_name1, field)] = temp_name1;
					}
					else if (color == "black"){
						temp_name2 = find_represent(temp_name1);
						ans[pair<string, string>(field, temp_name1)] = temp_name2;
						ans[pair<string, string>(temp_name1, field)] = temp_name2;
					}
				}	
			}

			if (n != 0){
				for (int i=0; i<n; i++)		
				{
					T cur_son = nodes[field]->son[i];
					dfs(cur_son);
				}		
				//cout<<field<<" "<<nodes[field]->color<<endl;
				nodes[field]->color = "black";
				unionset(field, nodes[field]->parent);
			}
			else{
				//cout<<field<<" "<<nodes[field]->color<<endl;
				nodes[field]->color = "black";
				unionset(field, nodes[field]->parent);
			}
		}

};

int main()
{
    GenTree<string> mytree;
	int n, m;
	string name1, name2, root;

	cin>>n;
	for (int i=0; i<n; i++){
		cin>>name1>>name2;
		
		represent[name1] = name1;
		represent[name2] = name2; 
		if (i==0){
			root = name1;
			mytree.add_node(name1);
			mytree.add_node(name2, name1);
		}
		else
			mytree.add_node(name2, name1);
	}
	cin>>m;
	for (int i=0; i<m; i++){
		cin>>name1>>name2;
		mytree.add_query(name1, name2);
		a[i] = pair<string, string>(name1, name2);
	}

	mytree.dfs(root);

	for (int i=0; i<m; i++){
		cout<<ans[a[i]]<<endl;
	}
	
    return 0;
}

 
마지막 점은 지나갈 수 없어...

좋은 웹페이지 즐겨찾기