百度之星初赛(B)--Factory---虚树/比格思茅/LCA
来源:互联网 发布:知乎女神王 出书 编辑:程序博客网 时间:2024/04/30 03:54
Factory
Accepts: 100
Submissions: 383
Time Limit: 20000/10000 MS (Java/Others)
Memory Limit: 132768/132768 K (Java/Others)
题目链接:http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=776&pid=1002
这个题我记得我学LCA的时候见过这种题,直接预处理两个点的LCA,容斥算距离暴力即可,可能是数据水了,宇航告诉我这种方法有数据可以卡死,我没有算时间复杂度,我记得我学LCA的时候做过,就直接上了,还好过了,我想了一下,如果考虑时间复杂度的话,我可以用比格思茅,大于sqrt的用bfs,小于的直接暴力,大体算了一下时间复杂度,不超时,其实正解应该是虚树,为什么我没有想到,虚树学的不到家。
代码:
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <vector>#define inf 0x3f3f3f3fusing namespace std;int fa[100010],anc[100010][32],deep[100010],dis[100010];struct node{ int to,val;};vector<struct node>edge[100010];vector<int>vec[100010];int T,n,m;void dfs(int x){ anc[x][0]=fa[x]; for(int i=1;i<=31;i++) anc[x][i]=anc[anc[x][i-1]][i-1]; int len=edge[x].size(); for(int i=0;i<len;i++){ struct node next=edge[x][i]; if(next.to!=fa[x]){ fa[next.to]=x; deep[next.to]=deep[x]+1; dis[next.to]=dis[x]+next.val; dfs(next.to); } }}int LCA(int x,int y){ if(deep[x]<deep[y]) swap(x,y); for(int i=31;i>=0;i--){ if(deep[y]<=deep[anc[x][i]]){ x=anc[x][i]; } } if(x==y) return x; for(int i=31;i>=0;i--){ if(anc[x][i]!=anc[y][i]){ x=anc[x][i]; y=anc[y][i]; } } return anc[x][0];}void Init(){ for(int i=0;i<=n;i++){ edge[i].clear(); vec[i].clear(); } memset(fa,0,sizeof(fa)); memset(anc,0,sizeof(anc));}int main(){ scanf("%d",&T); while(T--){ int u,v,w; scanf("%d%d",&n,&m); Init(); for(int i=1;i<n;i++){ scanf("%d%d%d",&u,&v,&w); edge[u].push_back((node){v,w}); edge[v].push_back((node){u,w}); } for(int i=1;i<=m;i++){ int x; scanf("%d",&x); for(int j=1;j<=x;j++){ int y; scanf("%d",&y); vec[i].push_back(y); } } fa[1]=1; dfs(1); //for(int i=1;i<=n;i++){ // printf("%d ",dis[i]); //} //cout<<endl; int q; scanf("%d",&q); while(q--){ int ans=inf; scanf("%d%d",&u,&v); int l1=vec[u].size(); int l2=vec[v].size(); for(int i=0;i<l1;i++){ for(int j=0;j<l2;j++){ int lca=LCA(vec[u][i],vec[v][j]); //printf("%d\n",lca); ans=min(ans,dis[vec[u][i]]+dis[vec[v][j]]-dis[lca]*2); } } printf("%d\n",ans); } } return 0;}
阅读全文
0 0
- 百度之星初赛(B)--Factory---虚树/比格思茅/LCA
- 2017百度之星初赛(B) 1002 Factory(倍增法求LCA)
- 百度之星初赛B 1002 Factory
- Chess(百度之星初赛B)
- HDU-2017"百度之星"程序设计大赛-初赛(B)-1002-Factory
- 百度之星初赛(B)--1006小小粉丝度度熊
- 2017百度之星初赛(B)-1001Chess
- 百度之星初赛(B)--Chess---简单dp
- 2017百度之星初赛b
- 2012百度之星初赛第一场B题
- 【百度之星】初赛第二场:B网页聚类
- 【2012百度之星/初赛下】B:网页聚类
- 百度之星2012初赛Day2 B - 度度熊的礼物
- hdu 4832 百度之星初赛二B
- 百度之星初赛B——Chess
- 2017百度之星初赛(B)1001Chess------hdu6114
- 2017 百度之星 初赛B轮 HDU6114 HDU6118 HDU6119
- 2017百度之星初赛B场总结
- android db 导入 手机 系统 目录 data/data/包名/databases
- 调unity webgl sendmessage
- web.xml中webAppRootKey
- 数据、数据元素、数据对象、数据结构的定义
- AtCoder Beginner Contest 070 D
- 百度之星初赛(B)--Factory---虚树/比格思茅/LCA
- 浅谈Java SE、Java EE、Java ME三者的区别
- 解决Win10成功安装pycrypto后依旧报错找不到
- 网页变幻云+canvas时钟
- 从能级的角度来看半导体的掺杂
- 由二叉树的前序序列和中序序列构建二叉树
- MAC上为Android Studio集成Genymotion模拟器
- web无插件播放RTSP摄像机方案,拒绝插件,拥抱H5!
- Java关于短路与&&的巧妙运用