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

PROBLEM

时空裂隙

SOLUTION

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

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

CODE

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 2e5 + 5; struct edge {
int v, w, nex;
} ed[MAXN * 2]; int head[MAXN], tot; void addedge(int u, int v,int w) {
tot++;
ed[tot].v = v;
ed[tot].w = w;
ed[tot].nex = head[u];
head[u] = tot;
} set<int> ss; struct data{
int ind,w;
}eg[MAXN*2]; bool cmp(data a,data b){
return a.w<b.w;
} int n,m; bool bridge[MAXN*2];
int dfn[MAXN],low[MAXN],num;
vector<pair<int,int>> g[MAXN];
set<int> nd; int fa[MAXN]; int DjsGet(int x){
if(x==fa[x])return x;
return fa[x] = DjsGet(fa[x]);
} void tarjan(int x,int in_edge){
dfn[x] = low[x] = ++num;
for(auto ver:g[x]){
int y = ver.first;
int i = ver.second;
if(!dfn[y]){
tarjan(y,i);
low[x] = min(low[x],low[y]);
if(low[y]>dfn[x]){
bridge[i] = bridge[i^1] = true;
}
}
else if(i!=(in_edge^1))
low[x] = min(low[x],dfn[y]);
}
} int main() {
scanf("%d%d%*d",&n,&m);
tot = 1;
for(int i=1;i<=m;i++){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
addedge(u,v,w);
addedge(v,u,w);
ss.insert(w);
eg[i]= {i*2,w};
}
sort(eg+1,eg+m+1,cmp);//边按权值从小到大排序
for(int i = 1;i<=n;i++)fa[i] = i;
int pos = 1;
for(auto curval:ss){
int pre = pos;
//建子图
for(pos;eg[pos].w<=curval&&pos<=m;pos++){
int ind = eg[pos].ind;
int x = ed[ind^1].v,y = ed[ind].v;
int fx = DjsGet(x);
int fy = DjsGet(y);
if(fx==fy)continue;
g[fx].push_back(make_pair(fy,ind));
g[fy].push_back(make_pair(fx,ind^1));
nd.insert(fx);
nd.insert(fy);
}
//求桥
for(auto i:nd){
if(!dfn[i])tarjan(i,0);
}
//init
for(auto i:nd){
dfn[i] = low[i] = 0;
g[i].clear();
}
num = 0;
nd.clear();
//缩点
for(int i= pre;i<pos;i++){
int ind = eg[i].ind;
int x = ed[ind^1].v,y = ed[ind].v;
int fx = DjsGet(x);
int fy = DjsGet(y);
if(fx==fy)continue;
fa[fx] = fy;
}
}
int ans = 0;
for(int i = 2;i<=tot;i+=2){
if(bridge[i])ans++;
}
printf("%d\n",ans);
return 0;
}

【并查集缩点+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. 老男孩Python全栈学习 S9 日常作业 003

    1.有变量name = "aleX leNb" 完成如下操作: # 移除 name 变量对应的值两边的空格,并输出处理结果 # 移除name变量左边的"al"并 ...

  2. 闭包创建自己的 plugin 示例 加载 loading

    plugin  插件 什么是 plugin? 实现一个功能,与主应用程序分离,减少主应用程序的大小,高复用,可维护 制作过程中,一定要避免依赖其他的元素,减少 id 等的使用,避免与页面中其他内容冲突 ...

  3. How to learn PDE (怎么学偏微分方程)

    To learn PDE, you need some knowledge of physics (to build up the intuition), solid training of anal ...

  4. 1.在虚拟机中安装Linux中的CentOS7系统

    1. 虚拟机的创建:如下图,可在右侧窗口中创建新的虚拟机,也可以在文件菜单中新建虚拟机,或者使用快捷键新建 这里选择“自定义(高级) ”,然后进入“下一步”设置 这里是选择虚拟机硬件的美容性的,默认就 ...

  5. 🍓 DOM常用基础知识点汇总(入门者适用) 🍓

    铛-今天又没啥事,来总结一下DOM的基础知识.(公司没活干我也很无奈

  6. TCP/IP(五)传输层之细说TCP的三次握手和四次挥手

    前言 这一篇我将介绍的是大家面试经常被会问到的,三次握手四次挥手的过程.以前我听到这个是什么意思呀?听的我一脸蒙逼,但是学习之后就原来就那么回事! 一.运输层概述 1.1.运输层简介 这一层的功能也挺 ...

  7. BIO 和 NIO

    一.阻塞(Block)和非阻塞(NonBlock) 阻塞和非阻塞是进程在访问数据的时候,数据是否准备就绪的一种处理方式,当数据没有准备的时候阻塞: 阻塞:往往需要等待缞冲区中的数据准备好过后才处理其他 ...

  8. 最清晰易懂的UML类图与类的关系详解

    虚线箭头指向依赖: 实线箭头指向关联: 虚线三角指向接口: 实线三角指向父类: 空心菱形能分离而独立存在,是聚合: 实心菱形精密关联不可分,是组合: 上面是UML的语法. 在画类图的时候,理清类和类之 ...

  9. Lua中的语句

    [赋值] 赋值的基本含义是修改一个变量或一个table中字段的值,这个和其它语言没有多少区别,但是对于Lua,有一个特性,它允许“多重赋值”,也就是一下子将多个值赋予多个变量,例如以下代码: , pr ...

  10. mybatis基础知识

    一.什么是Mybatis 这里借用官网的一句话介绍什么是mybatis:MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC ...