【并查集缩点+tarjan无向图求桥】Where are you @牛客练习赛32 D

PROBLEM

时空裂隙

SOLUTION

楠神口胡算法我来实现系列

从小到大枚举边权,对于当前的权值,在当前的图找出所有等于该权值的边,把这些边的顶点用其在并查集中的代表元(即fa[x])替换,然后建图,求所建图的桥边。求完之后把每条边的两个顶点合并(缩点),然后枚举下一个权值。最后统计桥边数量和就是答案。

CODE

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int MAXN = 2e5 + 5;
  5. struct edge {
  6. int v, w, nex;
  7. } ed[MAXN * 2];
  8. int head[MAXN], tot;
  9. void addedge(int u, int v,int w) {
  10. tot++;
  11. ed[tot].v = v;
  12. ed[tot].w = w;
  13. ed[tot].nex = head[u];
  14. head[u] = tot;
  15. }
  16. set<int> ss;
  17. struct data{
  18. int ind,w;
  19. }eg[MAXN*2];
  20. bool cmp(data a,data b){
  21. return a.w<b.w;
  22. }
  23. int n,m;
  24. bool bridge[MAXN*2];
  25. int dfn[MAXN],low[MAXN],num;
  26. vector<pair<int,int>> g[MAXN];
  27. set<int> nd;
  28. int fa[MAXN];
  29. int DjsGet(int x){
  30. if(x==fa[x])return x;
  31. return fa[x] = DjsGet(fa[x]);
  32. }
  33. void tarjan(int x,int in_edge){
  34. dfn[x] = low[x] = ++num;
  35. for(auto ver:g[x]){
  36. int y = ver.first;
  37. int i = ver.second;
  38. if(!dfn[y]){
  39. tarjan(y,i);
  40. low[x] = min(low[x],low[y]);
  41. if(low[y]>dfn[x]){
  42. bridge[i] = bridge[i^1] = true;
  43. }
  44. }
  45. else if(i!=(in_edge^1))
  46. low[x] = min(low[x],dfn[y]);
  47. }
  48. }
  49. int main() {
  50. scanf("%d%d%*d",&n,&m);
  51. tot = 1;
  52. for(int i=1;i<=m;i++){
  53. int u,v,w;
  54. scanf("%d%d%d",&u,&v,&w);
  55. addedge(u,v,w);
  56. addedge(v,u,w);
  57. ss.insert(w);
  58. eg[i]= {i*2,w};
  59. }
  60. sort(eg+1,eg+m+1,cmp);//边按权值从小到大排序
  61. for(int i = 1;i<=n;i++)fa[i] = i;
  62. int pos = 1;
  63. for(auto curval:ss){
  64. int pre = pos;
  65. //建子图
  66. for(pos;eg[pos].w<=curval&&pos<=m;pos++){
  67. int ind = eg[pos].ind;
  68. int x = ed[ind^1].v,y = ed[ind].v;
  69. int fx = DjsGet(x);
  70. int fy = DjsGet(y);
  71. if(fx==fy)continue;
  72. g[fx].push_back(make_pair(fy,ind));
  73. g[fy].push_back(make_pair(fx,ind^1));
  74. nd.insert(fx);
  75. nd.insert(fy);
  76. }
  77. //求桥
  78. for(auto i:nd){
  79. if(!dfn[i])tarjan(i,0);
  80. }
  81. //init
  82. for(auto i:nd){
  83. dfn[i] = low[i] = 0;
  84. g[i].clear();
  85. }
  86. num = 0;
  87. nd.clear();
  88. //缩点
  89. for(int i= pre;i<pos;i++){
  90. int ind = eg[i].ind;
  91. int x = ed[ind^1].v,y = ed[ind].v;
  92. int fx = DjsGet(x);
  93. int fy = DjsGet(y);
  94. if(fx==fy)continue;
  95. fa[fx] = fy;
  96. }
  97. }
  98. int ans = 0;
  99. for(int i = 2;i<=tot;i+=2){
  100. if(bridge[i])ans++;
  101. }
  102. printf("%d\n",ans);
  103. return 0;
  104. }

【并查集缩点+tarjan无向图求桥】Where are you @牛客练习赛32 D的更多相关文章

  1. POJ 3694 Network(并查集缩点 + 朴素的LCA + 无向图求桥)题解

    题意:给你一个无向图,有q次操作,每次连接两个点,问你每次操作后有几个桥 思路:我们先用tarjan求出所有的桥,同时我们可以用并查集缩点,fa表示缩点后的编号,还要记录每个节点父节点pre.我们知道 ...

  2. UVA 796 Critical Links(无向图求桥)

    题目大意:给你一个网络要求这里面的桥. 输入数据: n 个点 点的编号  (与这个点相连的点的个数m)  依次是m个点的   输入到文件结束. 桥输出的时候需要排序   知识汇总: 桥:   无向连通 ...

  3. UVA 796 Critical Links(模板题)(无向图求桥)

    <题目链接> 题目大意: 无向连通图求桥,并将桥按顺序输出. 解题分析: 无向图求桥的模板题,下面用了kuangbin的模板. #include <cstdio> #inclu ...

  4. HDU 4738--Caocao's Bridges(重边无向图求桥)

    Caocao's Bridges Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  5. 求1+2+3...+n 牛客网 剑指Offer

    求1+2+3...+n 牛客网 剑指Offer 题目描述 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). ...

  6. BestCoder冠军赛 - 1009 Exploration 【Tarjan+并查集缩点】

    [题意] 给一个图,这个图中既有有向边,又有无向边,每条边只能走一次,问图中是否存在环. 最多10^6个点,10^6个无向边,10^6个有向边 [题解] 因为既有有向边又有无向边,所以不能单纯的用ta ...

  7. POJ3694:Network(并查集+缩点+lca)

    Network Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 13172   Accepted: 4774 题目链接:htt ...

  8. 【BFS】【并查集】【Tarjan】【LCA】Gym - 101173H - Hangar Hurdles

    给你一张地图,给你q次询问,每次问你从A点到B点,最大能移动多大的箱子. 把每个点所能容纳的最大箱子求出来(BFS,八连通,一开始将所有边界点和障碍点入队).然后从大到小排序.然后用并查集将相邻(四联 ...

  9. hdu1811 拓扑排序+并查集缩点

    /*给定两个点之间的三种关系 = < >如果是=就将两点放到同一个集合里进行缩点 离线处理所有关系,先用并查集将等于关系缩成一个点 */ #include<bits/stdc++.h ...

随机推荐

  1. Django订单接入支付宝

    1.. 去支付宝申请 https://open.alipay.com/platform/home.htm 注:因为创建应用正式接入支付宝需要营业执照,所以我们可以使用沙箱环境来测试. 2. 一次选择管 ...

  2. Jenkins-在windows上配置自动化部署(Jenkins+Bonobo.Git.Server)

    本文配置Jenkins.git服务器采用 Bonobo.Git.Server 1. 登录后,打开Jenkins界面,新建一个任务 2. 配置信息 3. 配置git项目地址,我们先进行其他配置,等会再继 ...

  3. 苹果手机iOS11中fixed弹出框中input光标错位问题

    最近遇到了一个移动前端的BUG:手机弹出框中的输入框focus时光标可能会错位. 刚开始时我完全不知道错误原因是什么,在电脑上调试时完全没有问题,手机上出现问题时也没有找到规律.后来在网上搜索了大量的 ...

  4. SHELL希尔排序

    /****************************************************************************** * Compilation: javac ...

  5. [物理学与PDEs]第2章第4节 激波 4.1 间断连接条件

    1.  守恒律方程 $$\bex \cfrac{\p f}{\p t}+\cfrac{\p q}{\p x}=0 \eex$$ 在间断线上应满足 ``间断连接条件'': $$\bex [f]\cfra ...

  6. Nmpy函数总结

    函数和方法method总览 这是个Numpy函数和方法分类排列目录. 创建数组 arange, array, copy, empty, empty_like, eye, fromfile, fromf ...

  7. springMVC工作过程

    学习springmvc之前先学习一下他的工作过程 如图 1.用户通过客户端向服务器发送请求,请求会被springMVC的前端控制器DispatchServlet所拦截. 2.DispatchServl ...

  8. 安装tftp

    #!/bin/bash # tftp install # 20180711 # 仅测试过操作系统 ubuntu 16.04 download_url='http://img.fe.okjiaoyu.c ...

  9. 3.让linux 增加 wget 命令

    Wget主要用于下载文件,在安装软件时会经常用到   直接执行命令 : sudo yum -y install wget   就可以使用wget了

  10. 软件测试之adb命令-实际公司使用场景--今日log

    软件测试之adb命令-实际公司使用场景--今日log Dotest-董浩整理 1)可以看内存泄漏: 2)可以安装.卸载app--截图并提交bug: 3)可以通过抓app日志定位问题: 4)可以结合mo ...