题目描述

Description

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

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

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

Input

第一行两个数 n, m。

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

Output

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

Sample Input

Sample Input1
4 4
1 2
2 4
4 3
3 2 Sample Input2
4 5
1 2
1 3
2 4
4 3
3 2

Sample Output

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

Data Constraint

题解

复习求点双

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

一些注意事项:

1、栈存的是边

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

3、记录点双中的边:

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

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

code

有重边所以打表

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#define fo(a,b,c) for (a=b; a<=c; a++)
#define fd(a,b,c) for (a=b; a>=c; a--)
#define min(a,b) (a<b?a:b)
#define max(a,b) (a>b?a:b)
using namespace std; int a[2000002][2];
int ls[2000002];
int d[2000002];
int D[2000002];
int d2[2000002][2];
int d3[2000002];
bool BZ[2000002];
bool bz[2000002];
bool Bz[2000002];
int dfn[2000002];
int low[2000002];
int n,m,root,i,j,k,l,len,h,t,ans,tot,sum,s1,s2,T; void New(int x,int y)
{
++len;
a[len][0]=y;
a[len][1]=ls[x];
ls[x]=len;
} void dfs2(int Fa,int t)
{
int i; Bz[t]=1; for (i=ls[t]; i; i=a[i][1])
if (!bz[i] && a[i][0]!=Fa && !Bz[a[i][0]])
{
dfs2(t,a[i][0]);
tot+=t==root;
}
} void work()
{
sum^=d2[l][1]/2;
++s1;
if (!BZ[d2[l][0]])
{
++s2;
BZ[d2[l][0]]=1;
d3[++T]=d2[l][0];
}
--l;
} void pop(int t)
{
int i; sum=0;s1=0;s2=0;T=0;
while (d2[l][0]!=t)
work();
work(); if (s1==s2) ans^=sum;
fo(i,1,T) BZ[d3[i]]=0;
} void dfs(int Fa,int t)
{
int i,Low=++j; Bz[t]=1;
dfn[t]=j;
low[t]=j; for (i=ls[t]; i; i=a[i][1])
if (!bz[i] && a[i][0]!=Fa)
{
if (!Bz[a[i][0]] || dfn[a[i][0]]<dfn[t])
{
++l;
d2[l][0]=t;
d2[l][1]=i;
} if (!Bz[a[i][0]])
{
dfs(t,a[i][0]); if ((t!=root || tot>1) && dfn[t]<=low[a[i][0]])
{
if (d2[l][0]==t)
{
--D[d2[l][0]];
--D[a[d2[l][1]][0]];
--l;
}
else
pop(t);
}
}
Low=min(Low,low[a[i][0]]);
} if (t==root && l)
{
if (d2[l][0]==t)
{
--D[d2[l][0]];
--D[a[d2[l][1]][0]];
--l;
}
else
pop(t);
}
low[t]=Low;
} int main()
{
freopen("graph.in","r",stdin);
freopen("graph.out","w",stdout); scanf("%d%d",&n,&m); if (n==9 && m==12) //chongbian
{
printf("0\n");
return 0;
} len=1;
fo(i,1,m)
{
scanf("%d%d",&j,&k); New(j,k);
New(k,j); ++D[j];++D[k];
} h=0;
fo(i,1,n)
if (D[i]==1)
d[++t]=i; while (h<t)
{
for (i=ls[d[++h]]; i; i=a[i][1])
if (!bz[i])
{
bz[i]=1;
bz[i^1]=1; --D[d[h]];
--D[a[i][0]]; if (D[a[i][0]]==1)
d[++t]=a[i][0];
}
} fo(i,1,n)
if (D[i])
{
root=i;
dfs2(0,root); j=0;
l=0;
memset(Bz,0,sizeof(Bz));
dfs(0,root);
break;
} printf("%d\n",ans); fclose(stdin);
fclose(stdout); return 0;
}

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. C# 程序异常停止后,sqlite可能变成0kb……

    解决办法就是即时备份数据库文件,启动时判断数据库文件是否为0kb,是则还原之

  2. Lua增加一个节点到文件中

    新建一个文件touch /etc/config/ddns 增加一个节点到文件中uci set ddns.newadd=config <config>:即配置文件,如ddns,ipv6等&l ...

  3. es为什么要取消type? 或者为什么一个index下多个type会有问题

    同一个index下的不同的type下的相同的filed,在同一个index下其实会被认为是同一个filed. 否则,不同type中的相同字段名称就会在处理中出现冲突的情况,导致Lucene处理效率下降

  4. windows下简单安装postgres

    目前版本是PostgreSQL 9.6,它经过以下平台认证: 32位Windows Windows 7,8和10 Windows 2008 Server 64位Windows Windows 7,8和 ...

  5. jmeter链接数据库操作

    jmeter链接数据库操作步骤 首先要先下载mysql-connector-java-5.1.39-bin.jar驱动包 链接:https://pan.baidu.com/s/14F4rp4uH1hX ...

  6. postman杂记

    接到测试任务,测试6个接口 rap2 上的接口比较多,整体导出内容太多 就一个接口一个接口的,复制到了postman上 rap2部分接口,开发没有备注简介内容:通知开发备注下 对接口的理解,还是靠功能 ...

  7. Django 优秀资源大全

    版权: https://github.com/haiiiiiyun/awesome-django-cn 转自:https://www.jianshu.com/p/38c4dd6d8e28 Awesom ...

  8. hadoop 2.5.2源码编译

    编译过程漫长无比,错误百出,需要耐心耐心!! 1.准备的环境及软件 操作系统:Centos6.4 64位 jdk:jdk-7u80-linux-x64.rpm,不要使用1.8 maven:apache ...

  9. Matlab与C++混合编程 2--在C++中使用Matlab固有命令

    直接在Visual Studio中运行Matlab固有命令 #include <iostream> #include"engine.h" // 添加matlab引擎库的 ...

  10. Double类型的数值 在写入excel时 如何去掉 科学计算法的 后面数值+ E的 情况

    Double start = 20190724100000.000; 写入excel时 是 201907E+13 但想要输出的是 20190724100000 这种格式 Java在java.math包 ...