220501 T1 困难的图论 (tarjan 点双)
求满足题目要求的简单环,做出图中所有的点双,用vector存储点双中的边,如果该点双满足点数=边数,就是我们想要的,求边的异或和即可;如果该点双点数小于边数,说明有不只一个环覆盖,不满足题意。
- 1 #include<bits/stdc++.h>
- 2 using namespace std;
- 3 #define int long long
- 4 #define N 1000005
- 5 int read(){
- 6 int x=0,f=1;char ch;
- 7 while(ch>'9'||ch<'0'){
- 8 if(ch=='-') f=-1;ch=getchar();
- 9 }
- 10 while(ch>='0'&&ch<='9'){
- 11 x=x*10+ch-'0';ch=getchar();
- 12 }
- 13 return f*x;
- 14 }
- 15 int dfn[N],low[N],v[N],e[N],top1,top2;
- 16 int bcc,sc[N],n,m,x,y,ans;
- 17 int head[N],nxt[N*2],to[N*2],tot=1,num;
- 18 bool used[N],vis[N];
- 19 vector<int>a[N];//存点双连通分量含的边
- 20 void add(int x,int y){
- 21 nxt[++tot]=head[x];
- 22 head[x]=tot;
- 23 to[tot]=y;
- 24 }
- 25
- 26 void tarjan(int x){
- 27 dfn[x]=low[x]=++num;
- 28 v[++top1]=x;//存点
- 29 for(int i=head[x];i;i=nxt[i]){
- 30 int y=to[i];
- 31 if(used[i>>1]) continue;
- 32 used[i>>1]=1;
- 33 e[++top2]=i>>1;//存边
- 34 if(!dfn[y]){
- 35 tarjan(y);
- 36 low[x]=min(low[x],low[y]);
- 37 if(low[y]<dfn[x]) continue;//不是点双连通分量,跳过
- 38 bcc++;
- 39 while(1){
- 40 int z=v[top1--];
- 41 sc[bcc]++;
- 42 if(z==y) break;
- 43 }
- 44 sc[bcc]++;//割点也要加进去
- 45 while(1){
- 46 int z=e[top2--];
- 47 a[bcc].push_back(z);
- 48 if(z==(i>>1)) break;
- 49 }
- 50 }
- 51 low[x]=min(low[x],dfn[y]);
- 52 }
- 53 }
- 54
- 55 signed main(){
- 56 n=read(),m=read();
- 57 for(int i=1;i<=m;i++){
- 58 x=read(),y=read();
- 59 add(x,y),add(y,x);
- 60 }
- 61 tarjan(1);
- 62 for(int i=1;i<=bcc;i++){
- 63 if(a[i].size()!=sc[i]) continue;
- 64 for(int j=0;j<a[i].size();j++) vis[a[i][j]]=1;
- 65 }
- 66 for(int i=1;i<=m;i++) if(vis[i]) ans^=i;
- 67 printf("%d\n",ans);
- 68 }
用low[y]<dfn[x]判断其不是点双;注意tot从1开始;统计每个点双中点的数量时要加上割点(即数量要加1)
220501 T1 困难的图论 (tarjan 点双)的更多相关文章
- 【Codefoces487E/UOJ#30】Tourists Tarjan 点双连通分量 + 树链剖分
E. Tourists time limit per test: 2 seconds memory limit per test: 256 megabytes input: standard inpu ...
- 6409. 【NOIP2019模拟11.06】困难的图论(Tarjan求点双)
题目描述 Description 给定由 n 个点 m 条边组成的无向连通图,保证没有重边和自环. 你需要找出所有边,满足这些边恰好存在于一个简单环中.一个环被称为简单环,当且仅当它包含的所有点都只在 ...
- POJ 3177 Redundant Paths (tarjan边双连通分量)
题目连接:http://poj.org/problem?id=3177 题目大意是给定一些牧场,牧场和牧场之间可能存在道路相连,要求从一个牧场到另一个牧场要有至少两条以上不同的路径,且路径的每条pat ...
- 【BZOJ-1123】BLO Tarjan 点双连通分量
1123: [POI2008]BLO Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 970 Solved: 408[Submit][Status][ ...
- tarjan求双联通分量(割点,割边)
之前一直对tarjan算法的这几种不同应用比较混淆...我太弱啦! 被BLO暴虐滚过来 用tarjan求点双,很多神犇都给出了比较详细的解释和证明,在这里就不讲了(其实是这只蒟蒻根本不会orz) 这里 ...
- 图论-桥/割点/双连通分量/缩点/LCA
基本概念: 1.割点:若删掉某点后,原连通图分裂为多个子图,则称该点为割点. 2.割点集合:在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个 ...
- UVALive 5135 Mining Your Own Bussiness【tarjan点双】
LINK1 LINK2 题目大意 给你一个无向连通图,让你给一些点染上黑色,需要满足染色之后,断开任意一个节点,要满足任意一个联通块中剩下的节点中至少有一个黑点 思路 一开始想的是把每一个点双联通分量 ...
- POJ3177 Redundant Paths【tarjan边双联通分量】
LINK 题目大意 给你一个有重边的无向图图,问你最少连接多少条边可以使得整个图双联通 思路 就是个边双的模板 注意判重边的时候只对父亲节点需要考虑 你就dfs的时候记录一下出现了多少条连向父亲的边就 ...
- POJ2942 Knights of the Round Table【Tarjan点双联通分量】【二分图染色】【补图】
LINK 题目大意 有一群人,其中有一些人之间有矛盾,现在要求选出一些人形成一个环,这个环要满足如下条件: 1.人数大于1 2.总人数是奇数 3.有矛盾的人不能相邻 问有多少人不能和任何人形成任何的环 ...
随机推荐
- C# 委托/事件本质详解
委托 一.什么是委托 IL层面1>委托的本质就是一个类2>继承自System.MulticastDelegate3>委托里面内置了3个方法:Invoke(),BeginInvoke( ...
- Go语言基础一:环境配置与基础语法
配置开发环境 开始使用Go,首先需要一个完善的开发环境. 下载并安装Go 安装包的下载地址为:https://golang.org/dl/ go语言中文社区下载:https://studygolang ...
- 微信安装包从0.5M暴涨到260M,为什么我们的程序越来越大?
最近,微信安装包从v1.0的0.5M暴涨到V8.0的 260M引起大家热议,为什么我们开发的程序越来越大?本文做一个简单的讨论.(本文主要根据B站科技老男孩<逆向工程微信安装包,11年膨胀575 ...
- dockerfile操作
简介 Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明. 上下文路径 如下是一个简单的基于dockerfile创建镜像的命令,我们注意到启动处理镜像名和 ...
- 2550--HashMap源码解析
JDK版本 1.8 结构: HashMap实现了Map Cloneable Serializable接口: 基础了AbstractMap类,AbstractMap提供一些通用方法,如put remov ...
- mysql 之full join
首先,mysql中是不支持full join的,如果要实现类似的功能可以用union all,union会剔除重复.以下是实现实例 create table if not exists t1(`id` ...
- linux 判断变量是否相等方法
echo $? 输出上一个命令执行成功与否的情况 1表示失败 0 表示成功 test检测文件类型和比较值 有空格时等号才是判断,否则为赋值
- 微信小程序检查版本更新并重启
目录 1,前言 2,解决方案 3,调试须知 1,前言 最近开发小程序时候碰上了一个问题,当发布新版本小程序后,需要用户能赶紧用上最新的,避免出问题.查了一下官方文档,总结出几个情况如下: 微信运行时, ...
- 从零开始Blazor Server(14)--修改密码
目前,我们只做了在用户管理里强行修改密码,而没有做用户自行修改密码的功能,今天我们来实现它. 首先,我们的用户密码修改最好的位置应该就是在头像下面的下拉菜单里,所以我们在那里的LinkTemplate ...
- java方法---定义,调用
定义,调用 1.方法的定义 方法就是一段用来完成特定功能的代码片段,类似于其它语言的函数. 方法用于定义该类或该类的实例的行为特征和功能实现.方法是类和对象行为特征的抽象. 方法很类似于面向过程中的函 ...