求满足题目要求的简单环,做出图中所有的点双,用vector存储点双中的边,如果该点双满足点数=边数,就是我们想要的,求边的异或和即可;如果该点双点数小于边数,说明有不只一个环覆盖,不满足题意。

  1. 1 #include<bits/stdc++.h>
  2. 2 using namespace std;
  3. 3 #define int long long
  4. 4 #define N 1000005
  5. 5 int read(){
  6. 6 int x=0,f=1;char ch;
  7. 7 while(ch>'9'||ch<'0'){
  8. 8 if(ch=='-') f=-1;ch=getchar();
  9. 9 }
  10. 10 while(ch>='0'&&ch<='9'){
  11. 11 x=x*10+ch-'0';ch=getchar();
  12. 12 }
  13. 13 return f*x;
  14. 14 }
  15. 15 int dfn[N],low[N],v[N],e[N],top1,top2;
  16. 16 int bcc,sc[N],n,m,x,y,ans;
  17. 17 int head[N],nxt[N*2],to[N*2],tot=1,num;
  18. 18 bool used[N],vis[N];
  19. 19 vector<int>a[N];//存点双连通分量含的边
  20. 20 void add(int x,int y){
  21. 21 nxt[++tot]=head[x];
  22. 22 head[x]=tot;
  23. 23 to[tot]=y;
  24. 24 }
  25. 25
  26. 26 void tarjan(int x){
  27. 27 dfn[x]=low[x]=++num;
  28. 28 v[++top1]=x;//存点
  29. 29 for(int i=head[x];i;i=nxt[i]){
  30. 30 int y=to[i];
  31. 31 if(used[i>>1]) continue;
  32. 32 used[i>>1]=1;
  33. 33 e[++top2]=i>>1;//存边
  34. 34 if(!dfn[y]){
  35. 35 tarjan(y);
  36. 36 low[x]=min(low[x],low[y]);
  37. 37 if(low[y]<dfn[x]) continue;//不是点双连通分量,跳过
  38. 38 bcc++;
  39. 39 while(1){
  40. 40 int z=v[top1--];
  41. 41 sc[bcc]++;
  42. 42 if(z==y) break;
  43. 43 }
  44. 44 sc[bcc]++;//割点也要加进去
  45. 45 while(1){
  46. 46 int z=e[top2--];
  47. 47 a[bcc].push_back(z);
  48. 48 if(z==(i>>1)) break;
  49. 49 }
  50. 50 }
  51. 51 low[x]=min(low[x],dfn[y]);
  52. 52 }
  53. 53 }
  54. 54
  55. 55 signed main(){
  56. 56 n=read(),m=read();
  57. 57 for(int i=1;i<=m;i++){
  58. 58 x=read(),y=read();
  59. 59 add(x,y),add(y,x);
  60. 60 }
  61. 61 tarjan(1);
  62. 62 for(int i=1;i<=bcc;i++){
  63. 63 if(a[i].size()!=sc[i]) continue;
  64. 64 for(int j=0;j<a[i].size();j++) vis[a[i][j]]=1;
  65. 65 }
  66. 66 for(int i=1;i<=m;i++) if(vis[i]) ans^=i;
  67. 67 printf("%d\n",ans);
  68. 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. C# 委托/事件本质详解

    委托 一.什么是委托 IL层面1>委托的本质就是一个类2>继承自System.MulticastDelegate3>委托里面内置了3个方法:Invoke(),BeginInvoke( ...

  2. Go语言基础一:环境配置与基础语法

    配置开发环境 开始使用Go,首先需要一个完善的开发环境. 下载并安装Go 安装包的下载地址为:https://golang.org/dl/ go语言中文社区下载:https://studygolang ...

  3. 微信安装包从0.5M暴涨到260M,为什么我们的程序越来越大?

    最近,微信安装包从v1.0的0.5M暴涨到V8.0的 260M引起大家热议,为什么我们开发的程序越来越大?本文做一个简单的讨论.(本文主要根据B站科技老男孩<逆向工程微信安装包,11年膨胀575 ...

  4. dockerfile操作

    简介 Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明. 上下文路径 如下是一个简单的基于dockerfile创建镜像的命令,我们注意到启动处理镜像名和 ...

  5. 2550--HashMap源码解析

    JDK版本 1.8 结构: HashMap实现了Map Cloneable Serializable接口: 基础了AbstractMap类,AbstractMap提供一些通用方法,如put remov ...

  6. mysql 之full join

    首先,mysql中是不支持full join的,如果要实现类似的功能可以用union all,union会剔除重复.以下是实现实例 create table if not exists t1(`id` ...

  7. linux 判断变量是否相等方法

    echo $? 输出上一个命令执行成功与否的情况 1表示失败 0 表示成功 test检测文件类型和比较值 有空格时等号才是判断,否则为赋值

  8. 微信小程序检查版本更新并重启

    目录 1,前言 2,解决方案 3,调试须知 1,前言 最近开发小程序时候碰上了一个问题,当发布新版本小程序后,需要用户能赶紧用上最新的,避免出问题.查了一下官方文档,总结出几个情况如下: 微信运行时, ...

  9. 从零开始Blazor Server(14)--修改密码

    目前,我们只做了在用户管理里强行修改密码,而没有做用户自行修改密码的功能,今天我们来实现它. 首先,我们的用户密码修改最好的位置应该就是在头像下面的下拉菜单里,所以我们在那里的LinkTemplate ...

  10. java方法---定义,调用

    定义,调用 1.方法的定义 方法就是一段用来完成特定功能的代码片段,类似于其它语言的函数. 方法用于定义该类或该类的实例的行为特征和功能实现.方法是类和对象行为特征的抽象. 方法很类似于面向过程中的函 ...