hihoCoder 1069 最近公共祖先·三
2015-08-02 17:17
417 查看
#include <bits/stdc++.h> using namespace std; map<string,int> nameMap; string names[100005]; struct node{ int pa; vector<int> son; vector<pair<int,int> > qu; node() : pa(-1){} }no[100005]; int ans[100005]; int findset(int x){ if(x != no[x].pa) no[x].pa = findset(no[x].pa); return no[x].pa; } void dfs(int f){ no[f].pa = f; int len = no[f].son.size(); for(int i=0 ;i<len;i++){ int index = no[f].son[i]; dfs(index); no[index].pa = f; } int qlen = no[f].qu.size(); for(int i=0; i<qlen; i++){ pair<int, int> p = no[f].qu[i]; if(no[p.first].pa != -1) ans[p.second] = findset(p.first); } } int main(){ int N,M; scanf("%d",&N); for(int i=0; i<N; i++){ string fa,son; cin>>fa>>son; if(nameMap.find(fa) == nameMap.end()) nameMap[fa] = nameMap.size(); if(nameMap.find(son) == nameMap.end()) nameMap[son] = nameMap.size(); int nf = nameMap[fa], ns = nameMap[son]; names[nf] = fa; names[ns] = son; no[nf].son.push_back(ns); } scanf("%d",&M); for(int i=0; i<M; i++){ string qu1,qu2; cin>>qu1>>qu2; int n1 = nameMap[qu1], n2 = nameMap[qu2]; no[n1].qu.push_back(make_pair(n2,i)); no[n2].qu.push_back(make_pair(n1,i)); } dfs(1); for(int i = 0; i < M ; i++) //puts(names[ans[i]].c_str()); cout<<names[ans[i]]<<endl; return 0; }
相关文章推荐
- 图论浅析--最短路之Bellman-Ford
- laravel中的$request对象构造及请求生命周期
- Where is the Marble?
- Leetcode #223 Rectangle Area
- diffork.c
- 一个简单的模板引(han)擎(shu)
- 阿里2013双十一备战中的技术突破
- window删除损坏无法打开的文件
- 多校4-Walk Out
- AVL 树的插入和删除
- 奈氏准则和香农公式
- OGRE-降服巨兽
- 多校4-Walk Out 分类: 比赛 2015-08-02 17:15 21人阅读 评论(0) 收藏
- MySQL查询优化之COUNT()
- linux中使用LVM动态扩容
- iOS 导航连续退出2个页面
- 常见端口表汇总
- 什么是JAVABEAN?
- c++ enum类型常量
- machine learning in coding(python):根据关键字合并多个表(构建组合feature)