正题

题目链接:http://www.51nod.com/Challenge/Problem.html#problemId=1743


题目大意

nnn个点mmm条边的一张图,每次询问要求找出x,yx,yx,y直接的两条不重路径的最大值最小。


解题思路

首先第一条路径肯定是最小生成树上的路径,所以我们先求出最小生成树。

然后对与剩下的边我们从小到大加入图中,每条边(u,v)(u,v)(u,v)会作为在(u,v)(u,v)(u,v)之间的所有点对的第二条路径。也就是对与一个点对(x,y)(x,y)(x,y)中间有经过(u,v)(u,v)(u,v)的路径那么都会取到这条边的值,也就是将(u,v)(u,v)(u,v)这条路径取minminmin,然后询问时就是询问(x,y)(x,y)(x,y)之间的最大值。

而且因为是从小到大加入的,所有如果一个位置之间已经加入过就不需要管,所以我们可以开一个并查集记录跳到最上面没有加入的点。

时间复杂度O(mlog⁡n)O(m\log n)O(mlogn)


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e6+10;
struct node{int x,y;
}e[N];
struct edge_node{int to,next;
}a[N];
int n,m,q,tot,val[N],fa[N],ls[N];
int f[N][20],w[N][20],dep[N];
bool vis[N];
bool cmp(node x,node y)
{return abs(val[x.x]-val[x.y])<abs(val[y.x]-val[y.y]);}
int find(int x)
{return (fa[x]==x)?(x):(fa[x]=find(fa[x]));}
void addl(int x,int y){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;return;
}
void dfs(int x,int fa){if(x==341)x++,x--;f[x][0]=fa;dep[x]=dep[fa]+1;for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(y==fa)continue;dfs(y,x);}return;
}
int LCA(int x,int y){int ans=0;if(dep[x]>dep[y])swap(x,y);for(int i=18;i>=0;i--)if(dep[f[y][i]]>=dep[x])ans=max(ans,w[y][i]),y=f[y][i];if(x==y)return ans;for(int i=18;i>=0;i--)if(f[y][i]!=f[x][i])ans=max(ans,max(w[x][i],w[y][i])),x=f[x][i],y=f[y][i];return max(ans,max(w[x][0],w[y][0]));
}
int main()
{scanf("%d%d%d",&n,&m,&q);for(int i=1;i<=n;i++)scanf("%d",&val[i]),fa[i]=i;for(int i=1;i<=m;i++)scanf("%d%d",&e[i].x,&e[i].y);sort(e+1,e+1+m,cmp);for(int i=1;i<=m;i++){int x=find(e[i].x),y=find(e[i].y);if(x==y)continue;addl(e[i].x,e[i].y);addl(e[i].y,e[i].x);fa[x]=y;vis[i]=1;}dfs(1,0);for(int i=1;i<=n;i++)fa[i]=i,w[i][0]=2147483647;for(int i=1;i<=m;i++){if(vis[i])continue;int x=find(e[i].x),y=find(e[i].y);while(x!=y){if(dep[x]<dep[y])swap(x,y);w[x][0]=abs(val[e[i].x]-val[e[i].y]); fa[x]=f[x][0];x=find(x);}}for(int j=1;j<=18;j++)for(int i=1;i<=n;i++)f[i][j]=f[f[i][j-1]][j-1],w[i][j]=max(w[i][j-1],w[f[i][j-1]][j-1]);while(q--){int x,y;scanf("%d%d",&x,&y);int ans=LCA(x,y);if(ans==2147483647)printf("infinitely\n");else printf("%d\n",ans);}return 0;
}

51nod1743-雪之国度【最小生成树,LCA,并查集】相关推荐

  1. [51nod1743]雪之国度

    题目大意 给你n个点m条边的无向图,每个点有一个权值w,每条边的权值就是它连接两个点的权值差.有q个询问,给出两个点u,v,要从u到v找两条没有相同边的路径,使得两条路径上所有边权最大值最小.如果不足 ...

  2. 【割边缩点】解题报告:POJ - 3694 - Network(Tarjan割边缩点 + LCA + 并查集优化)

    POJ - 3694 - Network 给定一张N个点M条边的无向连通图,然后执行Q次操作,每次向图中添加一条边,并且询问当前无向图中"桥"的数量.N≤105,M≤2∗105,Q ...

  3. POJ 3694 (tarjan缩点+LCA+并查集)

    好久没写过这么长的代码了,题解东哥讲了那么多,并查集优化还是很厉害的,赶快做做前几天碰到的相似的题. 1 #include <iostream> 2 #include <algori ...

  4. POJ - 3694 Network(边双缩点+LCA+并查集优化)

    题目链接:点击查看 题目大意:给出一个由n个点组成的无向图,现在有m次操作,每次操作都会向图中增加一条无向边,每次操作后询问当前图中有多少个桥 题目分析:题意很好理解,思路也很好想,就是代码量有点小多 ...

  5. ssl1615-Frogger【图论,最小生成树,并查集】

    题目 给一个无向图,要求从点1到点2的一条路,要求这条路上的边的最大值尽量小. 输入输入 多组数据,每个数据n+1行,分别是n和点的坐标 2 0 0 3 4 3 17 4 19 4 18 5 0 输出 ...

  6. LeetCode 1135. 最低成本联通所有城市(最小生成树+排序+并查集)

    文章目录 1. 题目 2. 解题 1. Kruskal 2. prim 1. 题目 想象一下你是个城市基建规划者,地图上有 N 座城市,它们按以 1 到 N 的次序编号. 给你一些可连接的选项 con ...

  7. HDU1233——还是通常工程(最小生成树,并查集)

    http://acm.hdu.edu.cn/showproblem.php?pid=1233 题意:就是裸的最小生成树.这里用的是kruskal 使用的是并查集,将按距离排序的边,分别把点加到集合里. ...

  8. POJ 3694Network(Tarjan边双联通分量 + 缩点 + LCA并查集维护)

    [题意]: 有N个结点M条边的图,有Q次操作,每次操作在点x, y之间加一条边,加完E(x, y)后还有几个桥(割边),每次操作会累积,影响下一次操作. [思路]: 先用Tarjan求出一开始总的桥的 ...

  9. POJ 3694 Network(tarjan+lca+并查集)

    题目 给定一张NNN个点MMM条边的无向连通图,然后执行QQQ次操作,每次向图中添加一条边,并且询问当前无向图中"桥"的数量. 题解 先求出图中所有的边双,然后缩点 令c[x],c ...

最新文章

  1. python-selenum3 第五天定位——不常用定位与css定位详
  2. Android Launcher3(二) -- Drag拖动实现
  3. 处理局域网网速变慢问题的几个思路
  4. 【BZOJ2038】小Z的袜子,第一次的莫队算法
  5. 【Flink】Apache Flink 1.13.0 正式发布,流处理应用更加简单高效
  6. 简单设计企业级JOB平台
  7. VMware ESX虚拟磁盘性能测试
  8. Java事件的垃圾回收机制和跳出多重循环
  9. websocket binary 数据解析_websocket协议
  10. Spring常用注解。
  11. 硕士学位论文之wps页眉页脚
  12. 使用福禄克CFP光纤测试仪进行Tier 1和Tier 2光纤测试
  13. 如何用易语言做锁机软件
  14. web用户中心设计_关于Web设计和用户体验的10个误解
  15. vscode c++语法检查以及指定c++标准
  16. java jsp实现网站访问量的统计
  17. 百度AI市场热品试用 | 台面式双目活 体检测USB摄像头
  18. 如何钓鱼(如何钓鱼的方法)
  19. Android 安全框架 -- 总概
  20. 黑客软件大众化 【爆吧机的出现】杨丞琳贴吧遭网友攻陷

热门文章

  1. linux防火墙停用,关闭LINUX防火墙
  2. anjularjs ajax 调用,AngularJS AJAX调用的服务(AngularJS Ajax Call in Service
  3. 服务器虚拟化分为半,服务器虚拟化有哪些?
  4. leetcode59. 螺旋矩阵 II
  5. [mybatis]映射文件_参数处理
  6. 二叉树的遍历(算法导论第三版12.1-4)(包含先序遍历,后序遍历和中序遍历)
  7. 算法-排序-插入排序
  8. GCD and LCM HDU - 4497(素数打表+唯一分解定理)求多少种情况
  9. Redis高可用基石--主从同步
  10. oracle 取英文排序,Oracle中中文、数字,英文混杂形式的字段进行排序的方法