离线Tarjan lca
2015-10-13 23:18
302 查看
int fa[20005],anc[20005]; bool flag[20005]; vector<int> map[20005]; vector<int> query[20005]; inline void inputTree() { int a,b; for(int i=1;i<=N;i++) map[i].clear(); for(int i=1;i<N;i++) { scanf("%d%d",&a,&b); map[a].push_back(b); map[b].push_back(a); } } inline void inputQuery() { int a,b; for(int i=1;i<=N;i++) query[i].clear(); for(int i=1;i<=M-N+1;i++) { scanf("%d%d",&a,&b); query[a].push_back(b); query[b].push_back(a); } } inline void init() { ans=INF; for(int i=1;i<=N;i++) fa[i]=i; memset(flag,0,sizeof(flag)); } inline int find(int x) { if(x==fa[x]) return x; return fa[x]=find(fa[x]); } inline void HB(int x,int y) { int a,b; a=find(x);b=find(y); fa[a]=b; } inline void Tarjan(int x,int last) { int next; for(int i=0;i<map[x].size();i++) { next=map[x][i]; if(next!=last) { Tarjan(next,x); HB(x,next); anc[find(x)]=x; } } flag[x]=1; for(int i=0;i<query[x].size();i++) { int temp=query[x][i]; if(flag[temp]) { int LCA=anc[find(temp)]; } } } int main() { int i,a,b; scanf("%d",&T); while(T--) { scanf("%d%d",&N,&M); init(); inputTree(); inputQuery(); Tarjan(1,-1); } return 0; }
相比在线还是快点的。。
相关文章推荐
- 重新设置oracle登录账号和密码
- [Linux]服务管理:rpm包, 源码包
- 设计模式解读之一: 策略模式
- 【Android UI设计与开发】第08期:底部菜单栏(三)Fragment+FragmentTabHost实现仿新浪微博底部菜单栏
- 6.Oracle数据库SQL开发之 SELECT、WHERE以及行标识等
- HDU - 1166 敌兵布阵(线段树,单点修改)
- 两个float数的比较大小
- 超级强大的SVG SMIL animation动画详解
- 5.Oracle数据库SQL开发之 BINARY FLOAT和BINARY DOUBLE数据类型
- 1039_到底买不买
- 手机手机
- BZOJ4198荷马史诗
- 4.Oracle数据库SQL开发之 添加、删除、修改行
- iOS6新特征:UICollectionView高级使用示例之CircleLayout
- TCP协议三次握手过程分析
- 类的专有方法(__getattr__和__setattr__、__delattr__)
- HDU - 3506 Monkey Party(四边形优化)
- 1.开始使用Xamarin.Forms
- JavaScript私有变量
- Opencv3.0和contribute模块的下载 编译 安装