求满足题目要求的简单环,做出图中所有的点双,用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 点双)的更多相关文章

  1. 【Codefoces487E/UOJ#30】Tourists Tarjan 点双连通分量 + 树链剖分

    E. Tourists time limit per test: 2 seconds memory limit per test: 256 megabytes input: standard inpu ...

  2. 6409. 【NOIP2019模拟11.06】困难的图论(Tarjan求点双)

    题目描述 Description 给定由 n 个点 m 条边组成的无向连通图,保证没有重边和自环. 你需要找出所有边,满足这些边恰好存在于一个简单环中.一个环被称为简单环,当且仅当它包含的所有点都只在 ...

  3. POJ 3177 Redundant Paths (tarjan边双连通分量)

    题目连接:http://poj.org/problem?id=3177 题目大意是给定一些牧场,牧场和牧场之间可能存在道路相连,要求从一个牧场到另一个牧场要有至少两条以上不同的路径,且路径的每条pat ...

  4. 【BZOJ-1123】BLO Tarjan 点双连通分量

    1123: [POI2008]BLO Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 970  Solved: 408[Submit][Status][ ...

  5. tarjan求双联通分量(割点,割边)

    之前一直对tarjan算法的这几种不同应用比较混淆...我太弱啦! 被BLO暴虐滚过来 用tarjan求点双,很多神犇都给出了比较详细的解释和证明,在这里就不讲了(其实是这只蒟蒻根本不会orz) 这里 ...

  6. 图论-桥/割点/双连通分量/缩点/LCA

    基本概念: 1.割点:若删掉某点后,原连通图分裂为多个子图,则称该点为割点. 2.割点集合:在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个 ...

  7. UVALive 5135 Mining Your Own Bussiness【tarjan点双】

    LINK1 LINK2 题目大意 给你一个无向连通图,让你给一些点染上黑色,需要满足染色之后,断开任意一个节点,要满足任意一个联通块中剩下的节点中至少有一个黑点 思路 一开始想的是把每一个点双联通分量 ...

  8. POJ3177 Redundant Paths【tarjan边双联通分量】

    LINK 题目大意 给你一个有重边的无向图图,问你最少连接多少条边可以使得整个图双联通 思路 就是个边双的模板 注意判重边的时候只对父亲节点需要考虑 你就dfs的时候记录一下出现了多少条连向父亲的边就 ...

  9. POJ2942 Knights of the Round Table【Tarjan点双联通分量】【二分图染色】【补图】

    LINK 题目大意 有一群人,其中有一些人之间有矛盾,现在要求选出一些人形成一个环,这个环要满足如下条件: 1.人数大于1 2.总人数是奇数 3.有矛盾的人不能相邻 问有多少人不能和任何人形成任何的环 ...

随机推荐

  1. 第四天python3 python解析式-生成器-迭代器

    标准库datetime datetime模块  对日期.时间.时间戳的处理 datetime类 类方法: today() 返回本地时区当前时间的datetime对象: now(tz=None) 返回当 ...

  2. 【定时功能】消息的定时发送-基于RocketMQ

    一.功能介绍 要实现一个消息的定时发送功能,也就是让消息可以在某一天某一个时间具体节点进行发送.而我们公司的业务场景是类似短信的业务,而且数量不小,用户会进行号码.消息内容.定时发送时间等信息的提交. ...

  3. php apache 和mysql查看版本常用方法收集

    php: 1.命令行查询,下图是因为添加php进系统环境变量了 2.预定义常量PHP_VERSION查询 3.phpversion()函数查询 4.phpinfo()查询 apache: mysql: ...

  4. Rust 从入门到精通03-helloworld

    安装完成 Rust 之后,我们可以编写 Rust 的 Hello Word.这里介绍两种方式,一种是rust原生方式,一种是利用 cargo 工具(重要) 1.rustc 方式 1.1 创建项目目录 ...

  5. Odoo14 ir.rule 中的domain查询语句

    # ir.rule 中的domain查询语句 # 当你的字段是many2one.many2many.one2many的时候domain都会强制加上过滤域 # tree显示的时候也会过滤 # m.mod ...

  6. mosquitto使用的基本流程以及一些遇见的问题

    改配置文件 以记事本的方式打开mosquitto.conf更改部分内容,找到# listener port-number [ip address/host name/unix socket path] ...

  7. linux-0.11分析:init文件 main.c的第二个初始化函数trap_init() 第五篇随笔

    2.第二个初始化函数,trap_init() 参考 [github这个博主的 厉害][ https://github.com/sunym1993/flash-linux0.11-talk ] kern ...

  8. linux-0.11分析:boot文件 bootsect.s 第一篇随笔

    boot文件 bootsect.s 第一篇随笔 参考 [github这个博主的][ https://github.com/sunym1993/flash-linux0.11-talk ] bootse ...

  9. Luogu1088 火星人 (康托展开)

    皮一波 #include <iostream> #include <cstdio> #include <cstring> #include <algorith ...

  10. 一文理解Hadoop分布式存储和计算框架入门基础

    @ 目录 概述 定义 发展历史 发行版本 优势 生态项目 架构 组成模块 HDFS架构 YARN架构 部署 部署规划 前置条件 部署步骤 下载文件(三台都执行) 创建目录(三台都执行) 配置环境变量( ...