BZOJ2278 [Poi2011]Garbage[欧拉回路求环]
首先研究环上性质,发现如果状态不变的边就不需要动了,每次改的环上边肯定都是起末状态不同的边且仅改一次,因为如果有一条边在多个环上,相当于没有改,无视这条边之后,这几个环显然可以并成一个大环。所以,我们只关注起末状态不同的边。
然后,这些边形成一张图。对于每个连通块,如果有解的话,应当是一堆边不相交的简单环通过点互相连接的。这样一张图等价于一个欧拉回路,所以只要判每个连通块是不是欧拉回路(偶数度)即可。
然后是求解,目标就是把每个连通块所有的简单环都拎出来。回顾上述欧拉回路判断,实际上正是因为若干简单环构成的图可以一笔画。。所以仿照一笔画过程(也就是栈中记录的访问点顺序),再开一个栈,不断压栈,当遇到一个先前已经压到栈的点的时候说明形成了一个简单环,一直弹栈直到先前点为止,这时弹出元素就构成了一个环。。这样所有环就出来了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#define mst(x) memset(x,0,sizeof x)
#define dbg(x) cerr << #x << " = " << x <<endl
#define dbg2(x,y) cerr<< #x <<" = "<< x <<" "<< #y <<" = "<< y <<endl
using namespace std;
typedef long long ll;
typedef double db;
typedef pair<int,int> pii;
template<typename T>inline T _min(T A,T B){return A<B?A:B;}
template<typename T>inline T _max(T A,T B){return A>B?A:B;}
template<typename T>inline char MIN(T&A,T B){return A>B?(A=B,):;}
template<typename T>inline char MAX(T&A,T B){return A<B?(A=B,):;}
template<typename T>inline void _swap(T&A,T&B){A^=B^=A^=B;}
template<typename T>inline T read(T&x){
x=;int f=;char c;while(!isdigit(c=getchar()))if(c=='-')f=;
while(isdigit(c))x=x*+(c&),c=getchar();return f?x=-x:x;
}
const int N=1e5+,M=1e6+;
struct thxorz{
int head[N],to[M<<],nxt[M<<],tot;
thxorz(){tot=;}
inline void add(int x,int y){
to[++tot]=y,nxt[tot]=head[x],head[x]=tot;
to[++tot]=x,nxt[tot]=head[y],head[y]=tot;
}
}G;
int deg[N],stk[M],vis[M<<],bin[M],bcnt,top,st[N],tp,instk[N];
int n,m,cnt;
#define y G.to[j]
void dfs(int x){//dbg(x);
for(register int&j=G.head[x];j;j=G.nxt[j])if(!vis[j])vis[j]=vis[j^]=,bin[++bcnt]=j,dfs(y);
stk[++top]=x;
}
#undef y
vector<int> ans[M];
int main(){//freopen("test.in","r",stdin);//freopen("test.ans","w",stdout);
read(n),read(m);
for(register int i=,x,y,z,w;i<=m;++i){
read(x),read(y),read(z),read(w);
if(z^w)G.add(x,y),++deg[x],++deg[y];
}
for(register int i=;i<=n;++i)if(deg[i]&){puts("NIE");return ;}
for(register int i=;i<=n;++i)if(G.head[i]){
dfs(i);tp=;//dbg(i);
while(bcnt)vis[bin[bcnt]]=vis[bin[bcnt]^]=,--bcnt;
while(top){
int x=stk[top--];//dbg(x);
if(!instk[x])instk[x]=,st[++tp]=x;
else{
ans[++cnt].push_back(x);
do instk[st[tp]]=,ans[cnt].push_back(st[tp--]);while(st[tp]^x);
ans[cnt].push_back(x);
}
}
}
printf("%d\n",cnt);
for(register int i=;i<=cnt;++i,puts("")){
printf("%d ",ans[i].size()-);
for(register int j=;j<ans[i].size();++j)printf("%d ",ans[i][j]);
}
return ;
}
总结:这题启示我们在有关简单环的问题中,除了点双、边双等等转化策略以外,在涉及环的方面也可以采用欧拉路来考虑。总之,解决环相关的问题大概就是点双、边双、欧拉路以及栈的思想、dfs以及二分图染色等方法。
BZOJ2278 [Poi2011]Garbage[欧拉回路求环]的更多相关文章
- [POI2011]Garbage 欧拉回路
[POI2011]Garbage 链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2278 https://loj.ac/problem/216 ...
- BZOJ2278 : [Poi2011]Garbage
如果两个环相交,那么相交的部分相当于没走. 因此一定存在一种方案,使得里面的环都不相交. 把不需要改变状态的边都去掉,剩下的图若存在奇点则无解. 否则,每找到一个环就将环上的边都删掉,时间复杂度$O( ...
- Codeforces Round #346 (Div. 2) E - New Reform 无相图求环
题目链接: 题目 E. New Reform time limit per test 1 second memory limit per test 256 megabytes inputstandar ...
- POJ 1860 Currency Exchange / ZOJ 1544 Currency Exchange (最短路径相关,spfa求环)
POJ 1860 Currency Exchange / ZOJ 1544 Currency Exchange (最短路径相关,spfa求环) Description Several currency ...
- codevs4511信息传递(Tarjan求环)
题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知道自己的生日.之后每一 ...
- poj 2240 Bellman-Flod 求环
http://poj.org/problem?id=2240 深刻体现了自己代码能力有问题外加改模板能力有问题.外加Debug有问题.以后做到: 1.算法原理能够轻易弄出来. 2.代码模板自己收集各种 ...
- AC日记——传话 codevs 1506 (tarjan求环)
1506 传话 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题解 题目描述 Description 一个朋友网络,如果a认识b,那么如果a第 ...
- HDU - 6041:I Curse Myself(Tarjan求环&K路归并)
There is a connected undirected graph with weights on its edges. It is guaranteed that each edge app ...
- 洛谷P2444 [POI2000]病毒(AC自动机,DFS求环)
洛谷题目传送门 AC自动机入门--yyb巨佬的博客 AC自动机入手经典好题(虽然年代久远) 有了fail指针,trie树就不是原来的树型结构了,我们可以把它叫做trie图,由父节点向子节点连的边和fa ...
随机推荐
- tomcat8.5.37设置虚拟目录
之前做的solr和tomcat是放在tomcat的webapps下 solr7.2.1+tomcat8.5.37+jdk8安装配置 现在就是放在其他,通过tomcat的server.xml配置虚拟目录 ...
- [转帖]龙芯:Docker 配置与实践清单
Docker 配置与实践清单 http://www.sohu.com/a/254904706_198222 文章对来官方文档及 Docker Links[1] 中链接内容进行归档整理,包含了日常工作中 ...
- IDEA插件之alibaba编程规范
1.做什么 这是阿里巴巴的编码规范插件,规范内容可以查阅 https://github.com/alibaba/p3c/blob/master/阿里巴巴Java开发手册(华山版).pdf 2.File ...
- [DEBUG] spring boot在eclipse中用maven打包成jar访问templates报500错误
更新:打war包的话只要把html文件放在resources/templates下即可,根本不需要放外面. 配置application.yml和templates放外面这种做法,打war包确实不行. ...
- (二十四)JDBC应用的事务管理(转账事例)
目录 利用 Dbutils 进行事务操作(以转账为例) 转账实现方式(不优雅的方式) ThreadLocal 类 转账实现方式(优雅的方式) 利用 Dbutils 进行事务操作(以转账为例) 我们只在 ...
- 【Trie】Nikitosh 和异或
[参考博客]: LOJ#10051」「一本通 2.3 例 3」Nikitosh 和异或(Trie [题目链接]: https://loj.ac/problem/10051 [题意]: 找出两个不相交区 ...
- xcode 把项目代码提交到远程SVN服务器
环境 xcode 7 Mac air xcode默认支持GIT源码管理工具,但现在想把代码提交到已有到SVN服务器上,步骤如下: 1,在safari中打开svn链接地址,信任证书,输入用户名密码 , ...
- 如何用Java代码在SAP Marketing Cloud里创建contact数据
我们可以使用SAP Marketing Cloud提供的Contact create OData API在第三方应用里创建Contact主数据. API地址:/sap/opu/odata/sap/CU ...
- Spring中事务的传播行为,7种事务的传播行为,数据库事务的隔离级别
Propagation.REQUIRED 代表当前方法支持当前的事务,且与调用者处于同一事务上下文中,回滚统一回滚(如果当前方法是被其他方法调用的时候,且调用者本身即有事务),如果没有事务,则自己新建 ...
- Java 读取 .properties 文件的几种方式
Java 读取 .properties 配置文件的几种方式 Java 开发中,需要将一些易变的配置参数放置再 XML 配置文件或者 properties 配置文件中.然而 XML 配置文件需要通过 ...