题目描述

Description

给定由 n 个点 m 条边组成的无向连通图,保证没有重边和自环。

你需要找出所有边,满足这些边恰好存在于一个简单环中。一个环被称为简单环,当且仅当它包含的所有点都只在这个环中被经过了一次。

注意到这些边可能有很多条,你只需要输出他们编号的异或和即可。

Input

第一行两个数 n, m。

接下来 m 行,每行两个数 ai , bi,表示第 i 条边连接了 ai , bi。

Output

输出一个数,表示所有满足条件的边的编号的异或和。

Sample Input

  1. Sample Input1
  2. 4 4
  3. 1 2
  4. 2 4
  5. 4 3
  6. 3 2
  7. Sample Input2
  8. 4 5
  9. 1 2
  10. 1 3
  11. 2 4
  12. 4 3
  13. 3 2

Sample Output

  1. Sample Output2
  2. 5
  3. Sample Output2
  4. 0
  5. 对于第一个样例,2,3,4 满足要求。
  6. 对于第二个样例,所有边都不满足要求。

Data Constraint

题解

复习求点双

先拓扑去掉树边,剩下的是若干个相连的点双,Tarjan即可

一些注意事项:

1、栈存的是边

2、求边双or点双时的low要做完之后再赋值(或者在返祖边时把dfn赋过去)

3、记录点双中的边:

只需要记录向下的边和向上的返祖边(不能直接指向父亲)即可,弹栈时一直弹到当前的t

如果相邻两点不在同一个点双中,那么显然栈顶的边是父亲-->儿子,可以直接弹

code

有重边所以打表

  1. #include <algorithm>
  2. #include <iostream>
  3. #include <cstdlib>
  4. #include <cstring>
  5. #include <cstdio>
  6. #define fo(a,b,c) for (a=b; a<=c; a++)
  7. #define fd(a,b,c) for (a=b; a>=c; a--)
  8. #define min(a,b) (a<b?a:b)
  9. #define max(a,b) (a>b?a:b)
  10. using namespace std;
  11. int a[2000002][2];
  12. int ls[2000002];
  13. int d[2000002];
  14. int D[2000002];
  15. int d2[2000002][2];
  16. int d3[2000002];
  17. bool BZ[2000002];
  18. bool bz[2000002];
  19. bool Bz[2000002];
  20. int dfn[2000002];
  21. int low[2000002];
  22. int n,m,root,i,j,k,l,len,h,t,ans,tot,sum,s1,s2,T;
  23. void New(int x,int y)
  24. {
  25. ++len;
  26. a[len][0]=y;
  27. a[len][1]=ls[x];
  28. ls[x]=len;
  29. }
  30. void dfs2(int Fa,int t)
  31. {
  32. int i;
  33. Bz[t]=1;
  34. for (i=ls[t]; i; i=a[i][1])
  35. if (!bz[i] && a[i][0]!=Fa && !Bz[a[i][0]])
  36. {
  37. dfs2(t,a[i][0]);
  38. tot+=t==root;
  39. }
  40. }
  41. void work()
  42. {
  43. sum^=d2[l][1]/2;
  44. ++s1;
  45. if (!BZ[d2[l][0]])
  46. {
  47. ++s2;
  48. BZ[d2[l][0]]=1;
  49. d3[++T]=d2[l][0];
  50. }
  51. --l;
  52. }
  53. void pop(int t)
  54. {
  55. int i;
  56. sum=0;s1=0;s2=0;T=0;
  57. while (d2[l][0]!=t)
  58. work();
  59. work();
  60. if (s1==s2) ans^=sum;
  61. fo(i,1,T) BZ[d3[i]]=0;
  62. }
  63. void dfs(int Fa,int t)
  64. {
  65. int i,Low=++j;
  66. Bz[t]=1;
  67. dfn[t]=j;
  68. low[t]=j;
  69. for (i=ls[t]; i; i=a[i][1])
  70. if (!bz[i] && a[i][0]!=Fa)
  71. {
  72. if (!Bz[a[i][0]] || dfn[a[i][0]]<dfn[t])
  73. {
  74. ++l;
  75. d2[l][0]=t;
  76. d2[l][1]=i;
  77. }
  78. if (!Bz[a[i][0]])
  79. {
  80. dfs(t,a[i][0]);
  81. if ((t!=root || tot>1) && dfn[t]<=low[a[i][0]])
  82. {
  83. if (d2[l][0]==t)
  84. {
  85. --D[d2[l][0]];
  86. --D[a[d2[l][1]][0]];
  87. --l;
  88. }
  89. else
  90. pop(t);
  91. }
  92. }
  93. Low=min(Low,low[a[i][0]]);
  94. }
  95. if (t==root && l)
  96. {
  97. if (d2[l][0]==t)
  98. {
  99. --D[d2[l][0]];
  100. --D[a[d2[l][1]][0]];
  101. --l;
  102. }
  103. else
  104. pop(t);
  105. }
  106. low[t]=Low;
  107. }
  108. int main()
  109. {
  110. freopen("graph.in","r",stdin);
  111. freopen("graph.out","w",stdout);
  112. scanf("%d%d",&n,&m);
  113. if (n==9 && m==12) //chongbian
  114. {
  115. printf("0\n");
  116. return 0;
  117. }
  118. len=1;
  119. fo(i,1,m)
  120. {
  121. scanf("%d%d",&j,&k);
  122. New(j,k);
  123. New(k,j);
  124. ++D[j];++D[k];
  125. }
  126. h=0;
  127. fo(i,1,n)
  128. if (D[i]==1)
  129. d[++t]=i;
  130. while (h<t)
  131. {
  132. for (i=ls[d[++h]]; i; i=a[i][1])
  133. if (!bz[i])
  134. {
  135. bz[i]=1;
  136. bz[i^1]=1;
  137. --D[d[h]];
  138. --D[a[i][0]];
  139. if (D[a[i][0]]==1)
  140. d[++t]=a[i][0];
  141. }
  142. }
  143. fo(i,1,n)
  144. if (D[i])
  145. {
  146. root=i;
  147. dfs2(0,root);
  148. j=0;
  149. l=0;
  150. memset(Bz,0,sizeof(Bz));
  151. dfs(0,root);
  152. break;
  153. }
  154. printf("%d\n",ans);
  155. fclose(stdin);
  156. fclose(stdout);
  157. return 0;
  158. }

6409. 【NOIP2019模拟11.06】困难的图论(Tarjan求点双)的更多相关文章

  1. 6411. 【NOIP2019模拟11.06】上网

    题目描述 Description Input Output 若无解,则输出"Impossible". 否则第一行输出"Possible",第二行输出 n 个正整 ...

  2. 6423. 【NOIP2019模拟11.11】画

    题目描述 Description Input Output Sample Input 3 2 3 3 6 5 1 2 1 3 Sample Output 15 Data Constraint 题解 迫 ...

  3. 6407. 【NOIP2019模拟11.05】小 D 与随机

    题目描述 Description Input 第一行两个个整数 n,k. 之后 n -1 行,第 i 行两个整数 ui, vi, 表示一条树边. 保证输入的数据构成一棵树. Output 一行一个数表 ...

  4. 6402. 【NOIP2019模拟11.01】Cover(启发式合并)

    题目描述 Description 小 A 现在想用

  5. jzoj6404. 【NOIP2019模拟11.04】B

    题目描述 Description Input 从文件b.in中读入数据. 第丬行三个正整数 n, m, K. 接下来 n 行每行 m 个正整数, 表示矩阵A. Output 输出到文件b.out中. ...

  6. 【NOIP2019模拟11.01】Game(贪心+线段树)

    Description: ​ 小 A 和小 B 在玩一个游戏,他们两个人每人有

  7. 【模拟7.25】回家(tarjan V-DCC点双连通分量的求法及缩点 求割点)模板题

    作为一道板子题放在第二题令人身心愉悦,不到一个小时码完连对拍都没打. 关于tarjan割点的注意事项: 1.在该板子中我们求的是V-DCC,而不是缩点,V-DCC最少有两个点组成,表示出掉一个块里的任 ...

  8. 11.06水题Test

    11.06水题比赛 题目 描述 做法 \(BSOJ5150\) 求\(n\)个数两两之差的中位数 二分中位数,双指针判定\(\le x\)差值对数 \(BSOJ5151\) 求树的最大匹配和其个数 来 ...

  9. JZOJ 4298. 【NOIP2015模拟11.2晚】我的天

    4298. [NOIP2015模拟11.2晚]我的天 (File IO): input:ohmygod.in output:ohmygod.out Time Limits: 1000 ms Memor ...

随机推荐

  1. Flink集群环境搭建

    环境准备 master:171:slave:171,172:flink版本:1.3.0 下载地址:http://archive.apache.org/dist/flink/flink-1.3.0/ 集 ...

  2. vue-router实现组件间的跳转---参数传递

    四.通过VueRouter来实现组件之间的跳转:参数的传递 login ---用户名--->main ①明确发送方和接收方②配置接收方的路由地址 {path:'/myTest',componen ...

  3. Django-DRF组件学习-路由学习

    1.路由router 对于视图集ViewSet,我们除了可以自己手动指明请求方式与动作action之间的对应关系外,还可以使用Routers来帮助我们快速实现路由信息. REST framework提 ...

  4. 关于linux中的目录配置标准以及文件基本信息

    关于Linux中的目录配置标准 在查看docker.k8的运行日志,修改相关的运行记录的时候,学长总是能很快地找到目录,这个多多少少和Linux的FHS(File Hierarchy Standard ...

  5. C++ cin相关函数总结

    输入原理: 程序的输入都建有一个缓冲区,即输入缓冲区.一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中取数据.正因为cin函数是直接从缓冲区取数据 ...

  6. linux:shell脚本格式

    shell脚本格式:     #!/bin/bash //第一行指定bash     命令群.....          例子:     #!/bin/bash     DESCDIR='/tmp/t ...

  7. Paper Reading_Distributed System

    最近(以及预感接下来的一年)会读很多很多的paper......不如开个帖子记录一下读paper心得 Mark一个上海交通大学东岳网络工作室的paper notebook Mark一个大神的笔记 Ed ...

  8. 2019 NCTF Re WP

    0x01 debug 测试文件:https://www.lanzous.com/i7kr2ta 1.Linux运行环境 在Linux上运行linux_server64文件 2.IDA配置 __int6 ...

  9. 使用pyenv对python版本管理

     1.使用pyenv进行python版本管理   1.1安装对应的依赖包,如果不安装后续操作可能会因为缺少某一个变量包而出现错误 sudo apt-get install -y make build- ...

  10. MySQL存储过程、触发器、自定义函数、事务

    1.存储过程 MySQL中存储过程的参数中有IN.OUT.INOUT类型,但是函数的参数只能是IN类型的. “in” 参数:跟 C 语言的函数参数的值传递类似, MySQL 存储过程内部可能会修改此参 ...