分析:

可以证明,任意两点间的符合题目要求的路径必然是在MST上的。

有了这个,这题就水了。。。我没有想到,是venique神犇告诉我的

然后在MST上做LCA倍增,顺便维护d[i][j]表示i到他的2^j倍祖先的最大权,就好了~

我是蒟蒻。。LCA写萎了。。看了venique的代码,才发现错。。。

View Code

  1 #include <cstdio>
  2 #include <cstring>
  3 #include <cstdlib>
  4 #include <algorithm>
  5 #include <iostream>
  6
  7 #define N 110000
  8 #define M 1000000
  9
 10 using namespace std;
 11
 12 struct KRU
 13 {
 14     int a,b,e,d;
 15 }kru[M];
 16
 17 int head[N],next[M],to[M],len[M],cnt,n,m,qu,f[N][22],d[N][22],fa[N],dpt[N],q[N];
 18
 19 inline void add(int u,int v,int w)
 20 {
 21     to[cnt]=v; len[cnt]=w; next[cnt]=head[u]; head[u]=cnt++;
 22 }
 23
 24 inline bool cmp(const KRU &a,const KRU &b)
 25 {
 26     return a.d<b.d;
 27 }
 28
 29 void read()
 30 {
 31     memset(head,-1,sizeof head); cnt=0;
 32     scanf("%d%d",&n,&m);
 33     for(int i=1;i<=m;i++) scanf("%d%d%d",&kru[i].a,&kru[i].b,&kru[i].d);
 34 }
 35
 36 int findfa(int x)
 37 {
 38     if(fa[x]!=x) fa[x]=findfa(fa[x]);
 39     return fa[x];
 40 }
 41
 42 void kruskal()
 43 {
 44     sort(kru+1,kru+1+m,cmp);
 45     for(int i=1;i<=n;i++) fa[i]=i;
 46     int num=1;
 47     for(int i=1;i<=m;i++)
 48         if(findfa(kru[i].a)!=findfa(kru[i].b))
 49         {
 50             fa[findfa(kru[i].a)]=findfa(kru[i].b);
 51             num++;
 52             add(kru[i].a,kru[i].b,kru[i].d); add(kru[i].b,kru[i].a,kru[i].d);
 53             if(num==n) break;
 54         }
 55 }
 56
 57 void bfs()
 58 {
 59     int h=1,t=2,sta;
 60     q[1]=1; dpt[1]=1;
 61     while(h<t)
 62     {
 63         sta=q[h++];
 64         for(int i=head[sta];~i;i=next[i])
 65             if(to[i]!=f[sta][0])
 66             {
 67                 dpt[to[i]]=dpt[sta]+1;
 68                 f[to[i]][0]=sta;
 69                 d[to[i]][0]=len[i];
 70                 q[t++]=to[i];
 71             }
 72     }
 73 }
 74
 75 void initlca()
 76 {
 77     for(int j=1;j<=20;j++)
 78         for(int i=1;i<=n;i++)
 79         {
 80             d[i][j]=max(d[i][j-1],d[f[i][j-1]][j-1]);
 81             f[i][j]=f[f[i][j-1]][j-1];
 82         }
 83 }
 84
 85 int lca(int x,int y)
 86 {
 87     int rt=0;
 88     if(dpt[x]<dpt[y]) swap(x,y);
 89     for(int i=20;i>=0;i--)
 90         if(dpt[f[x][i]]>=dpt[y])
 91         {
 92             rt=max(rt,d[x][i]);
 93             x=f[x][i];
 94         }
 95     if(x==y) return rt;
 96     for(int i=20;i>=0;i--)
 97         if(f[x][i]!=f[y][i])
 98         {
 99             rt=max(rt,max(d[x][i],d[y][i]));
100             x=f[x][i]; y=f[y][i];
101         }
102     return max(rt,max(d[x][0],d[y][0]));
103 }
104
105 void go()
106 {
107     kruskal();
108     bfs();
109     initlca();
110     scanf("%d",&qu);
111     int si=1,x,y,p1,p2,q1,q2;
112     for(int i=1;i<=qu;i++)
113     {
114         scanf("%d%d%d%d",&p1,&p2,&q1,&q2);
115         x=(long long)(si+p1)*p2%n+1;
116         y=(long long)(si+q1)*q2%n+1;
117         si=lca(x,y);
118         printf("%d\n",si);
119     }
120 }
121
122 int main()
123 {
124     read();
125     go();
126     return 0;
127 } 

转载于:https://www.cnblogs.com/proverbs/archive/2012/10/29/2745501.html

TYVJ 1557 MST+LCA相关推荐

  1. Codevs 1519 过路费(Mst+Lca)

    1519 过路费 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 大师 Master 题目描述 Description 在某个遥远的国家里,有 n个城市.编号为 1,2,3,-,n. ...

  2. [NOIP2013提高组] CODEVS 3287 火车运输(MST+LCA)

    一开始觉得是网络流..仔细一看应该是最短路,再看数据范围..呵呵不会写...这道题是最大生成树+最近公共祖先.第一次写..表示各种乱.. 因为要求运输货物质量最大,所以路径一定是在最大生成树上的.然后 ...

  3. 【Codeforces】1051F. The Shortest Statement【MST+LCA+最短路】

    F. The Shortest Statement [题目描述] 传送门 [题解] 题目也说了,重点是m-n<=20,我们就可以先跑最小生成树,最后剩下最多21条边,对着44个端点(包括起点和终 ...

  4. 比赛经验总结--187

    cqround1 1.这次比赛160分 (1)反质数:60 (2)二分答案+2sat:验证:  0分 (3)树上LCA+推公式: 100分 2.总结:这次比赛第三题做起来非常顺,做过类似的题:奶牛大集 ...

  5. 【XSY2485】MST(最小生成树+倍增lca+并查集)

    题面 Description 给定一个nnn个点mmm条边的连通图,保证没有自环和重边.对于每条边求出,在其他边权值不变的情况下,它能取的最大权值,使得这条边在连通图的所有最小生成树上.假如最大权值为 ...

  6. Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)...

    转载自:http://hi.baidu.com/lydrainbowcat/blog/item/2194090a96bbed2db1351de8.html 基本概念: 1.割点:若删掉某点后,原连通图 ...

  7. szu 寒训 day#3 ST表 和 LCA问题 附例题 菜鸡解法

    昨天我们讲述了树状数组今天我们来讲ST表(解决静态RMQ (Rang Minmum/Maximum Query)问题的数据结构) 假如说我们暴力去查询区间的最值得话每次操作都是O(n) 如果询问次数跟 ...

  8. 【最小生成树+LCA】Imperial roads

    http://codeforces.com/gym/101889 I 先跑一遍最小生成树,把经过的边和答案记录下来 对于每个询问的边,显然如果处于MST中,答案不变 如果不在MST中,假设这条边连上了 ...

  9. CF E2 - Daleks' Invasion (medium) (LCA求两点树上路径上的最大边权)

    http://codeforces.com/contest/1184/problem/E2 题意:给出一副图,首先求出这幅图的最小生成树 , 然后修改这幅图上不属于最小生成树的边权,使得修改后的图在求 ...

最新文章

  1. python安装后怎么配置环境变量_Python安装与环境变量的配置
  2. hive job oom
  3. VBA遍历文件夹下文件文件实用源码
  4. redis+aop防重复提交
  5. Boost:bzip2解压缩器
  6. python:else与循环语句联合用法
  7. 利用反射做类参数的校验
  8. 塔塔建网站服务器,塔塔帝国忘记哪个区怎么办
  9. mysql安装过程遇到的问题_个人在mysql安装过程中遇见的问题
  10. 蚂蚁员工人均都能买1套杭州的房子了?!好后悔,当初错失了蚂蚁...
  11. Genius‘s Gambit【学习进度条1】
  12. 【人工智能】Astar算法求解8数码问题(QDU)
  13. 成分句法分析与依存句法分析
  14. 《跑步该怎么跑》读书笔记
  15. 某地环境空气质量分析(1)
  16. Layui设置table指定行的背景色
  17. 《SQL必知必会》学习笔记——第十二课 连结表
  18. ipad iphone开发_如何在iPhone或iPad上“不信任”计算机
  19. 关于值班表的前端显示
  20. 面试:Handler内存泄露的原因是什么?

热门文章

  1. javase_03作业
  2. 15、解决14中csv用excel打开乱码的问题 open('zhihu.csv','w',newline='',encoding='utf-8-sig')...
  3. BZOJ1911:[Apio2010]特别行动队——题解
  4. Linux CentOS 修改服务器主机名hostname
  5. 《Java并发编程的艺术》一一第2章Java并发机制的底层实现原理
  6. 简单入门——深度学习笔记(Part II)
  7. maven编译不通过:软件包com.sun.org.apache.xml.internal.security.utils.Base64 不存在
  8. IOS Key-Value Observing (KVO)
  9. 北漂周记--第2记--培训开始
  10. (转载)NSOperation and NSOperationQueue教程(翻译)