【LOJ#2162】【POI2011】Garbage(欧拉回路)

题面

LOJ

题解

首先有一个比较显然的结论,对于不需要修改颜色的边可以直接删掉,对于需要修改的边保留。说白点就是每条边要被访问的次数可以直接模二。证明的话就是如果一条边被经过了两次,证明其连通了两侧的两个块,那么把这两次删掉,可以把两侧各拆分成一个欧拉回路,不会影响答案。

于是剩下的边直接对于每一个连通块算欧拉回路。

然后对于强制定向之后的图直接\(dfs\)找到所有简单环就可以了。

#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
#define MAX 100100
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
int n,m;
int f[MAX];
int getf(int x){return x==f[x]?x:f[x]=getf(f[x]);}
struct Line{int v,next;}e[MAX*20];
int h[MAX],cnt=2,dg[MAX],cur[MAX];
void Add(int u,int v){e[cnt]=(Line){v,h[u]};h[u]=cnt++;dg[v]++;}
bool vis[MAX*10];int dir[MAX*10];
vector<int> Ans[MAX];int tot;
void dfs(int u)
{
for(int &i=cur[u];i;i=e[i].next)
{
if(vis[i>>1])continue;int j=i;
vis[i>>1]=true;dfs(e[i].v);
dir[j>>1]=j&1;
}
}
int St[MAX],top;bool inq[MAX];
void DFS(int u)
{
St[++top]=u;inq[u]=true;
for(int &i=h[u];i;i=e[i].next)
{
if(!inq[u])return;
int v=e[i].v;if((i&1)!=dir[i>>1])continue;
if(inq[v])
{
int p;++tot;Ans[tot].push_back(v);
do{p=St[top--];Ans[tot].push_back(p);inq[p]=false;}while(p!=v);
St[++top]=v;inq[v]=true;
}
else DFS(v);
}
}
int main()
{
n=read();m=read();
for(int i=1;i<=n;++i)f[i]=i;
for(int i=1;i<=m;++i)
{
int u=read(),v=read(),s=read(),t=read();
if(s^t)Add(u,v),Add(v,u),f[getf(u)]=getf(v);
}
for(int i=1;i<=n;++i)if(dg[i]&1){puts("NIE");return 0;}
for(int i=1;i<=n;++i)cur[i]=h[i];
for(int i=1;i<=n;++i)if(getf(i)==i)dfs(i);
for(int i=1;i<=n;++i)DFS(i);
printf("%d\n",tot);
for(int i=1;i<=tot;++i)
{
printf("%d ",(int)Ans[i].size()-1);
for(int u:Ans[i])printf("%d ",u);puts("");
}
return 0;
}

【LOJ#2162】【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[欧拉回路求环]

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

  3. [LOJ #2162]「POI2011」Garbage

    题目大意:给一张$n$个点$m$条边的无向图,每条边是黑色的或白色的,要求变成一个目标颜色.可以从任意一个点开始,走一个简单环,回到开始的点,所经过的边颜色翻转.可以走无数次.问是否有一个方案完成目标 ...

  4. BZOJ2278 : [Poi2011]Garbage

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

  5. POI2011题解

    POI2011题解 2214先咕一会... [BZOJ2212][POI2011]Tree Rotations 线段树合并模板题. #include<cstdio> #include< ...

  6. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  7. POI做题笔记

    POI2011 Conspiracy (2-SAT) Description \(n\leq 5000\) Solution 发现可拆点然后使用2-SAT做,由于特殊的关系,可以证明每次只能交换两个集 ...

  8. LOJ#2170. 「POI2011」木棍 Sticks

    题目链接 题意就是给你一堆线段,然后线段有长度和颜色,让你选三条组成一个三角形,这三条线段颜色不能一样 题解: 做法:贪心 首先按照长度给这些线段排序一遍 然后贪心的去选,对于已经选出来同种颜色的,就 ...

  9. [POI2011]SMI-Garbage

    题目描述 http://main.edu.pl/en/archive/oi/18/smi The Byteotian Waste Management Company (BWMC) has drast ...

随机推荐

  1. excel文字随单元格大小变化

    对于不想因为伸缩等,造成部分文字看不见 或者 格式变形等,可以采用缩小字体或适应文字: 1.excel中可以选择缩小字体填充,这样,缩小excel就不怕了:  2.word中,excel表设置适应文字 ...

  2. 《移动WEB前端高级开发实践@www.java1234.com.pdf》——2

    5.3 作用域.闭包和this let 声明的变量只存在于其所在的代码块中 由于 JS 是基于词法(静态)作用域的语言,词法作用域的含义是在函数定义时就确定了作用域,而不是函数执行时再确定 calcu ...

  3. nodejs攻略——第一章 配置

    nodejs这玩意吧,我也是心血来潮的学习,所以啊.看这篇文章之前请大家有以下技能,如果没有..我不确定你能看得懂,毕竟我文采水平实在有限. 前置技能要求: c#或java 熟练+ JavaScrip ...

  4. JAVA集合框架(二)-List和Set

    List的常用实现类 list集合是有序的,顺序即添加的顺序,元素是可重复的. ArrayList LinkedList Vector ArrayList 底层基于数组实现.在add元素的过程中,如果 ...

  5. LOG日志溯源取证总结

    windows操作系统事件日志 C:\Windows\System32\winevt\Logs\ *( XP C:\Windows\System32) 应用程序日志 App Event.Evtx(Ap ...

  6. ES6中Class的用法及在微信小程序中的应用实例

    1.ES6的基本用法 ES6 提供了更接近传统语言的写法,引入了 Class(类)这个概念,作为对象的模板.通过class关键字,可以定义类.基本上,ES6 的class可以看作只是一个语法糖,它的绝 ...

  7. ABP入门教程11 - 展示层实现增删改查-视图

    点这里进入ABP入门教程目录 创建目录 在展示层(即JD.CRS.Web.Mvc)的Views下新建文件夹Course //用以存放Course相关视图 创建视图 在JD.CRS.Web.Mvc/Vi ...

  8. Centos7安装python3和pip3(一)

    安装相关依赖 1 yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-dev ...

  9. jQuery实现简单的tab切换

    html: <section>   <nav id="nav">     <a class="on">tab1</a& ...

  10. Export Receives The Errors ORA-1555 ORA-22924 ORA-1578 ORA-22922 (Doc ID 787004.1)

    Export Receives The Errors ORA-1555 ORA-22924 ORA-1578 ORA-22922 (Doc ID 787004.1) APPLIES TO: Oracl ...