首先研究环上性质,发现如果状态不变的边就不需要动了,每次改的环上边肯定都是起末状态不同的边且仅改一次,因为如果有一条边在多个环上,相当于没有改,无视这条边之后,这几个环显然可以并成一个大环。所以,我们只关注起末状态不同的边。

然后,这些边形成一张图。对于每个连通块,如果有解的话,应当是一堆边不相交的简单环通过点互相连接的。这样一张图等价于一个欧拉回路,所以只要判每个连通块是不是欧拉回路(偶数度)即可。

然后是求解,目标就是把每个连通块所有的简单环都拎出来。回顾上述欧拉回路判断,实际上正是因为若干简单环构成的图可以一笔画。。所以仿照一笔画过程(也就是栈中记录的访问点顺序),再开一个栈,不断压栈,当遇到一个先前已经压到栈的点的时候说明形成了一个简单环,一直弹栈直到先前点为止,这时弹出元素就构成了一个环。。这样所有环就出来了。

 #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[欧拉回路求环]的更多相关文章

  1. [POI2011]Garbage 欧拉回路

    [POI2011]Garbage 链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2278 https://loj.ac/problem/216 ...

  2. BZOJ2278 : [Poi2011]Garbage

    如果两个环相交,那么相交的部分相当于没走. 因此一定存在一种方案,使得里面的环都不相交. 把不需要改变状态的边都去掉,剩下的图若存在奇点则无解. 否则,每找到一个环就将环上的边都删掉,时间复杂度$O( ...

  3. Codeforces Round #346 (Div. 2) E - New Reform 无相图求环

    题目链接: 题目 E. New Reform time limit per test 1 second memory limit per test 256 megabytes inputstandar ...

  4. POJ 1860 Currency Exchange / ZOJ 1544 Currency Exchange (最短路径相关,spfa求环)

    POJ 1860 Currency Exchange / ZOJ 1544 Currency Exchange (最短路径相关,spfa求环) Description Several currency ...

  5. codevs4511信息传递(Tarjan求环)

    题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知道自己的生日.之后每一 ...

  6. poj 2240 Bellman-Flod 求环

    http://poj.org/problem?id=2240 深刻体现了自己代码能力有问题外加改模板能力有问题.外加Debug有问题.以后做到: 1.算法原理能够轻易弄出来. 2.代码模板自己收集各种 ...

  7. AC日记——传话 codevs 1506 (tarjan求环)

    1506 传话  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 白银 Silver 题解       题目描述 Description 一个朋友网络,如果a认识b,那么如果a第 ...

  8. 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 ...

  9. 洛谷P2444 [POI2000]病毒(AC自动机,DFS求环)

    洛谷题目传送门 AC自动机入门--yyb巨佬的博客 AC自动机入手经典好题(虽然年代久远) 有了fail指针,trie树就不是原来的树型结构了,我们可以把它叫做trie图,由父节点向子节点连的边和fa ...

随机推荐

  1. 同一个ip,不同端口号,cookie会被覆盖

    参考资料:https://blog.csdn.net/czh500/article/details/80420459

  2. [转帖]K8s 学习者绝对不能错过的最全知识图谱(内含 58个知识点链接)

    K8s 学习者绝对不能错过的最全知识图谱(内含 58个知识点链接)   https://www.cnblogs.com/alisystemsoftware/p/11429164.html 需要加强学习 ...

  3. (七)mybatis 的输入映射与输出映射

    目录 前言 输入映射 - - 传递 pojo 包装类型 (复杂查询 ) 输出映射 - - resultType 输出映射 - - resultMap 前言 通过 paramterType 指定输入参数 ...

  4. 一文让你明白Redis持久化

    网上虽然已经有很多类似的介绍了,但我还是自己总结归纳了一下,自认为内容和细节都是比较齐全的. 文章篇幅有 4k 多字,货有点干,断断续续写了好几天,希望对大家有帮助.不出意外地话,今后会陆续更新 Re ...

  5. css鼠标悬浮控制元素隐藏与显示

    在网页开发中经常有需求是鼠标移动到一个元素A身上时,另外一个元素B显示. 如下图 当鼠标移到图片上时,相关的描述从下方显示出来. css实现原理与情景: A 是 B 的父元素 B 默认隐藏 B{opa ...

  6. 服务返回的json数据过大,nginx无法返回给client

    现象:请求同样的服务器,N多个接口中,只有一个接口未返回:从日志看,请求已到后端服务,并返回 解决方案:配置nginx缓冲大小 ###Nginx的缓冲区的大小 proxy_buffer_size 5m ...

  7. grpc的demo

    一 grpc的为什么比http快? 1- 用Proto Buffer 作为序列化工具 2- 采用http2协议,头部压缩,多路复用 3- 基于netty的IO框架 二 grpc的demo A lib工 ...

  8. Javascript中的事件二

    <!------------------示例代码一---------------------><!DOCTYPE html PUBLIC "-//W3C//DTD XHTM ...

  9. windows下Jmeter压测端口占用问题(亲测有效)

    windows下Jmeter压测端口占用问题 1 报错信息描述 压测的初期,在设置了 150qps/s 的并发数下压测几分钟后 Jmeter 就出现了如下报错. JAVA.NET.BINDEXCEPT ...

  10. 关于阮一峰老师es6(第三版)中管道机制代码的理解浅析

    最近正在学习阮一峰老师的es6(第三版)教材,在学到第七章<函数的扩展>中的箭头函数嵌套时,文中提到了一个关于“管道机制”的示例,文中源代码如下: //es6(第三版)教材中的管道机制源代 ...