hdu 6115 Factory LCA
来源:互联网 发布:mac 4k 字体太小 编辑:程序博客网 时间:2024/06/05 10:05
题目链接
这个题目 O(qn2 logn)10s能跑过?逗我玩啊...暴力真的是靠勇气啊.
数据不想吐槽了,百毒之星 . 直接预处理每个节点到根节点的距离,然后暴力枚举LCA 维护最小..
#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#include<set>#include<vector>#include<queue>#include<map>#define inf 0x3f3f3f3f#define pii pair<int, int> using namespace std;typedef long long ll;const ll mod=1e9+7;const int maxn=2e5+10;int depth[maxn],parent[maxn][30];int dis[maxn];//parent表示每次往上走2^k步的父亲,dis表示每次走2^k路径的最小值 vector<int>vt[maxn];vector<pii>G[maxn];int t,n,m,q;void clear(){ for(int i=1;i<maxn;i++) G[i].clear(); for(int i=1;i<maxn;i++) vt[i].clear();}void dfs(int u,int fa,int dep,int d){depth[u]=dep;dis[u]=d;for(int i=1;i<20;i++){parent[u][i]=parent[parent[u][i-1]][i-1];}int len=G[u].size();for(int i=0;i<len;i++){int v=G[u][i].first;if(v==fa)continue;parent[v][0]=u;dfs(v,u,dep+1,d+G[u][i].second);}}int lca(int u,int v){if(depth[u]<depth[v])swap(u,v);int k=depth[u]-depth[v];for(int i=0;i<20;i++){if((1<<i)&k) u=parent[u][i];}if(u!=v){for(int i=19;i>=0;i--){if(parent[u][i]!=parent[v][i]){u=parent[u][i];v=parent[v][i];}}u=parent[u][0];}return u;}int get_dis(int u,int v){int f=lca(u,v);return dis[u]+dis[v]-2*dis[f];}int main(){ cin>>t; while(t--) { scanf("%d %d",&n,&m); clear(); int x,y,z; for(int i=1;i<n;i++) { scanf("%d %d %d",&x,&y,&z); G[x].push_back(make_pair(y,z)); G[y].push_back(make_pair(x,z)); } for(int i=1;i<=m;i++) { scanf("%d",&x); while(x--) { scanf("%d",&y); vt[i].push_back(y); } } dfs(1,-1,0,0); scanf("%d",&q); while(q--) {int res=inf; scanf("%d %d",&x,&y); int len1=vt[x].size(); int len2=vt[y].size(); for(int i=0;i<len1;i++) { int v=vt[x][i]; for(int j=0;j<len2;j++) { if(res==0) break; int u=vt[y][j]; if(u==v) { res=0; break; } } } for(int i=0;i<len1;i++) { int v=vt[x][i]; for(int j=0;j<len2;j++) { if(res==0) break; int u=vt[y][j]; res=min(res,get_dis(u,v));}} printf("%d\n",res); } } return 0;}
阅读全文
0 0
- hdu 6115 Factory LCA
- hdu 6115 Factory(lca + st)
- HDU 6115 Factory LCA求树上距离
- hdu 6115 Factory(lca暴力)
- hdu 6115 Factory(LCA+暴力)
- HDU 6115 Factory(在线倍增LCA)
- hdu6115 Factory(lca)
- hdu 2874(LCA应用)
- hdu 4547(tarjan LCA)
- hdu 4547(tarjan LCA)
- hdu 4547(tarjan LCA)
- HDU 4547 lca
- HDU 2586 LCA
- hdu 2874 (LCA)
- hdu 2856 (LCA)
- HDU 3078 Network LCA
- hdu 3078 (LCA+排序)
- HDU - 2586 LCA
- hdu 6119 二分 OR 尺取
- 读取配置文件-重构封装
- MJPG-streamer源码分析-输出部分
- mysql删除重复记录语句的方法 作者: 字体:[增加 减小] 类型:转载 时间:2010-06-21 我要评论 查询及删除重复记录的SQL语句,虽然有点乱,但内容还是不错的。 . .
- 智能指针简单实现
- hdu 6115 Factory LCA
- django学习三--发邮件
- 程序控制过程机器级表示(访问条件码)-《深入理解计算机系统》笔记
- linux 压缩解压命令
- 计算机装系统
- 正整数分组
- scrapy爬虫运行问题
- 使用limit查询的同时取得总的记录数:SQL_CALC_FOUND_ROWS和FOUND_ROWS()
- MYSQL主从数据库搭建