【JZOJ6409】困难的图论
description
给定由 n 个点 m 条边组成的无向连通图,保证没有重边和自环。
你需要找出所有边,满足这些边恰好存在于一个简单环中。一个环被称为简单环,当且仅当它包含的所有点都只在这个环中被经过了一次。
注意到这些边可能有很多条,你只需要输出他们编号的异或和即可。
analysis
- 然而复习了一波\(tarjan\),其实这个简单环就是求点双 
- 求出每个点双,判断点双里的边数是否等于点双点数 
- 这个不能暴力求,方法就是记录每个点有多少条返祖边、返祖边的异或和 
- 因为这些返祖边指向的点和该点本身肯定在同一个点双中 
- 感觉\(tarjan\)这种东西还是记下好一点,不过跑得好慢很奇怪 
code
#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<vector>
#define MAXN 1000005
#define MAXM 2000005
#define ll int
#define reg register ll
#define max(x,y) ((x>y)?(x):(y))
#define min(x,y) ((x<y)?(x):(y))
#define fo(i,a,b) for (reg i=a;i<=b;++i)
#define fd(i,a,b) for (reg i=a;i>=b;--i)
#define rep(i,a) for (reg i=last[a];i;i=next[i])
using namespace std;
ll last[MAXM],next[MAXM],tov[MAXM],id[MAXM];
ll dfn[MAXN],low[MAXN],stack[MAXN],where[MAXN],num[MAXN],xorval[MAXN];
ll n,m,tot,top,ans,sum,root=1,size;
bool bz[MAXN],cut[MAXN];
vector<ll>v[MAXN];
inline ll read()
{
	ll x=0,f=1;char ch=getchar();
	while (ch<'0' || '9'<ch){if (ch=='-')f=-1;ch=getchar();}
	while ('0'<=ch && ch<='9')x=x*10+ch-'0',ch=getchar();
	return x*f;
}
inline void link(ll x,ll y,ll z){next[++tot]=last[x],last[x]=tot,tov[tot]=y,id[tot]=z;}
inline void tarjan(ll x)
{
	dfn[x]=low[x]=++tot,bz[x]=1,stack[++top]=x;ll flag=0;
	rep(i,x)if (!dfn[tov[i]])
	{
		tarjan(tov[i]),low[x]=min(low[x],low[tov[i]]);
		if (low[tov[i]]>=dfn[x])
		{
			++flag,++sum;ll tmp,total=0,xorsum=0;
			if (x!=root || flag>1)cut[x]=1;
			do
			{
				tmp=stack[top--],v[sum].push_back(tmp),total+=num[tmp],xorsum^=xorval[tmp];
			}
			while (tmp!=tov[i]);
			v[sum].push_back(x);
			if (total==v[sum].size())ans^=xorsum;
		}
	}
	else
	{
		if (dfn[tov[i]]>dfn[x])continue;
		++num[x],xorval[x]^=id[i];
		low[x]=min(low[x],dfn[tov[i]]);
	}
}
int main()
{
	freopen("graph.in","r",stdin);
	freopen("graph.out","w",stdout);
	n=read(),m=read();
	fo(i,1,m)
	{
		ll x=read(),y=read();
		link(x,y,i),link(y,x,i);
	}
	tot=0,tarjan(1);
	printf("%d\n",ans);
	return 0;
}
【JZOJ6409】困难的图论的更多相关文章
- 6409. 【NOIP2019模拟11.06】困难的图论(Tarjan求点双)
		题目描述 Description 给定由 n 个点 m 条边组成的无向连通图,保证没有重边和自环. 你需要找出所有边,满足这些边恰好存在于一个简单环中.一个环被称为简单环,当且仅当它包含的所有点都只在 ... 
- 220501 T1 困难的图论 (tarjan 点双)
		求满足题目要求的简单环,做出图中所有的点双,用vector存储点双中的边,如果该点双满足点数=边数,就是我们想要的,求边的异或和即可:如果该点双点数小于边数,说明有不只一个环覆盖,不满足题意. 1 # ... 
- LeetCode刷题总结-动态规划篇
		本文总结LeetCode上有动态规划的算法题,推荐刷题总数为54道.具体考点分析如下图: 1.中心扩展法 题号:132. 分割回文串 II,难度困难 2.背包问题 题号:140. 单词拆分 II,难度 ... 
- Cocos2d-x 地图步行实现1:图论Dijkstra算法
		下一节<Cocos2d-x 地图行走的实现2:SPFA算法>: http://blog.csdn.net/stevenkylelee/article/details/38440663 本文 ... 
- QBXT Day 5图论相关
		图论是NOIP的一个非常重要的考点,换句话说,没有图论,NOIP的考纲就得少一大半(虽然很NOIP没有考纲) 图论这玩意吧,和数论一样是非常变态的东西,知识点又多又杂,但是好在一个事,他比较直观比较好 ... 
- lesson1-图的概念和图论模型
		说明: 图论专题开设的目的主要是作为本学期复习巩固和分享自己对于图论的理解,主要参考的是老师的PPT.应老师要求,不能共享文件,抱歉! 参考书目:[1] J.A. Bondy, U.S.R. Mur ... 
- 4专题总结-图论和DFS、BFS
		1图论: 1.1 133. Clone Graph https://leetcode.com/problems/clone-graph/#/description 思路:这题可以对照拷贝随机链表那道 ... 
- [leetcode] 题型整理之图论
		图论的常见题目有两类,一类是求两点间最短距离,另一类是拓扑排序,两种写起来都很烦. 求最短路径: 127. Word Ladder Given two words (beginWord and end ... 
- winform中dataGridView单元格根据值设置新值,彻底解决绑定后数据类型转换的困难
		// winform中dataGridView单元格在数据绑定后,数据类型更改困难,只能迂回实现.有时候需要将数字变换为不同的文字描述,就会出现int32到string类型转换的异常,借助CellFo ... 
随机推荐
- Python 基础 2-1 列表入门
			引言 列表 list 是由一系列按照特定顺序排列的元素组成的,它是一种有序的数据集合. 你可以添加任何类型的元素到列表中,其中的元素之间可以没有任何关系. 列表简介 Python 使用方括号 [] 来 ... 
- MATLAB生成exe脱离matlab运行可执行程序
			https://blog.csdn.net/u013007900/article/details/53485204 侵权即删. ———————————————— 版权声明:本文为CSDN博主「小木匠_ ... 
- 让微信小程序每次请求的时候不改变session_id的方法
			让微信小程序每次请求的时候不改变session_id的方法 每次微信小程序请求的时候都会改变session id, 还好他的请求方法内可以设置header头 所以只需要在启动程序后第一次请求服务器获得 ... 
- mysql查找字段空、不为空的方法总结
			1.不为空 Select * From table_name Where id<>'' Select * From table_name Where id!='' 2.为空 Select ... 
- shell编写启动脚本
			[root@confluence bin]# vim /etc/init.d/confluence #!/bin/bash # Confluence Linux service controller ... 
- dubbo管理平台安装
			dubbo-admin.war可在网上百度去下载,但是我下载了好几个,发布上去服务启动都报错,这个时候大概是我们系统的JDK和编译dubbo-admin.war的JDK版本不同导致的了,强烈建议自己下 ... 
- php-异步上传插件
			http://www.cnblogs.com/kissdodog/archive/2012/12/15/2819025.html 
- Repeatable Read
			在Repeatable Read隔离级别下,一个事务可能会遇到幻读(Phantom Read)的问题. 幻读是指,在一个事务中,第一次查询某条记录,发现没有,但是,当试图更新这条不存在的记录时,竟然能 ... 
-  导致页面顶部空白一行
			模板文件生成html文件以后会在页面body开头处生成可见的控制符 导致页面头部出现一个空白行,导致这样的原因就是页面的编码格式是UTF-8 + BOM 解决方法,最简单的就是使用编辑器重新保存文件 ... 
- [NOIP模拟23]题解
			中间鸽了好几篇啊QAQ……有时间再补吧…… A.mine sbdp,考场上写的巨麻烦不过还是能A的(虽然MLE了……每一维都少开1就A掉了555).设$dp[i][j][k]$为枚举到第i位,第i位是 ... 
