[POI2011]Śmieci

题目大意:

一个\(n(n\le10^5)\)个点\(m(m\le10^6)\)条边的无向图,每条边有边权\(0/1\),试找出若干个环,使得每次翻转环上所有边的权值,使得最后所有边权都是\(0\)。

思路:

权值为\(0\)的边都没有用,因为若方案存在,一定存在一种方案使得所有环只经过\(1\)边。

因此我们只留下\(1\)边,暴力DFS找环即可。注意要加上当前弧优化。

源代码:

#include<stack>
#include<cstdio>
#include<cctype>
#include<vector>
#include<cstring>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return x;
}
const int N=1e5+1,M=2e6;
int deg[N],h[N];
bool mark[M],ins[N];
struct Edge {
int to,next;
};
Edge e[M];
inline void add_edge(const int &u,const int &v) {
e[++h[0]]=(Edge){v,h[u]};h[u]=h[0];deg[u]++;
e[++h[0]]=(Edge){u,h[v]};h[v]=h[0];deg[v]++;
}
std::stack<int> stk;
std::vector<std::vector<int> > ans;
void dfs(const int &x) {
if(ins[x]) {
const int k=ans.size();
ans.resize(k+1);
int y;
do {
y=stk.top();
stk.pop();
ins[y]=false;
ans[k].push_back(y);
} while(y!=x);
}
for(int &i=h[x];~i;i=e[i].next) {
const int &y=e[i].to;
if(mark[i]) continue;
mark[i]=mark[i^1]=true;
stk.push(x);
ins[x]=true;
dfs(y);
}
}
int main() {
memset(h,-1,sizeof h);
const int n=getint(),m=getint();
for(register int i=0;i<m;i++) {
const int u=getint(),v=getint();
if(getint()^getint()) {
add_edge(u,v);
}
}
for(register int i=1;i<=n;i++) {
if(deg[i]%2==1) {
puts("NIE");
return 0;
}
}
for(register int i=1;i<=n;i++) {
dfs(i);
}
printf("%lu\n",ans.size());
for(register unsigned i=0;i<ans.size();i++) {
printf("%lu ",ans[i].size());
for(register unsigned j=0;j<ans[i].size();j++) {
printf("%d ",ans[i][j]);
}
printf("%d\n",ans[i][0]);
}
return 0;
}

[POI2011]Śmieci的更多相关文章

  1. BZOJ2527: [Poi2011]Meteors

    补一发题解.. 整体二分这个东西,一开始感觉复杂度不是很靠谱的样子 问了po姐姐,说套主定理硬干.. #include<bits/stdc++.h> #define ll long lon ...

  2. BZOJ2276: [Poi2011]Temperature

    2276: [Poi2011]Temperature Time Limit: 20 Sec  Memory Limit: 32 MBSubmit: 293  Solved: 117[Submit][S ...

  3. BZOJ2213: [Poi2011]Difference

    2213: [Poi2011]Difference Time Limit: 10 Sec  Memory Limit: 32 MBSubmit: 343  Solved: 108[Submit][St ...

  4. BZOJ2212: [Poi2011]Tree Rotations

    2212: [Poi2011]Tree Rotations Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 391  Solved: 127[Submi ...

  5. BZOJ 2212: [Poi2011]Tree Rotations( 线段树 )

    线段树的合并..对于一个点x, 我们只需考虑是否需要交换左右儿子, 递归处理左右儿子. #include<bits/stdc++.h> using namespace std; #defi ...

  6. bzoj 2217 [Poi2011]Lollipop 乱搞 贪心

    2217: [Poi2011]Lollipop Time Limit: 15 Sec  Memory Limit: 64 MBSec  Special JudgeSubmit: 383  Solved ...

  7. BZOJ_2529_[Poi2011]Sticks_贪心

    BZOJ_2529_[Poi2011]Sticks_贪心 Description Little Johnny was given a birthday present by his grandpare ...

  8. BZOJ_2212_[Poi2011]Tree Rotations_线段树合并

    BZOJ_2212_[Poi2011]Tree Rotations_线段树合并 Description Byteasar the gardener is growing a rare tree cal ...

  9. BZOJ_2527_[Poi2011]Meteors_整体二分

    BZOJ_2527_[Poi2011]Meteors_整体二分 Description Byteotian Interstellar Union (BIU) has recently discover ...

随机推荐

  1. oracle查询重复数据方法

    SQL重复记录查询方法 2008年08月14日 星期四 21:01 SQL重复记录查询 1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断select * from peop ...

  2. 生成ansible-playbook的yaml文件的代码(字典排序问题无法解决)

    import yaml import collections def add_task(): return None def add_vars(): return None def add_handl ...

  3. openstack swift节点安装手册3-最后的安装配置及验证

    以下步骤都在controller节点上执行 1.远程获取/etc/swift/swift.conf文件: curl -o /etc/swift/swift.conf https://git.opens ...

  4. 读SRE Google运维解密有感(一)

    前言 这几天打算利用碎片时间读了一下"SRE Google运维解密"这本书,目前读了前几章,感觉收获颇多,结合自己的工作经历和书中的要点,写一些感悟和思考 SRE 有关SRE我就不 ...

  5. nginx实现tomcat的负载均衡及企业内部应用的代理

    192.168.3.87  mysql+redis+tomcat 192.168.3.112 nginx:6688 192.168.3.86  nginx+h5 环境准备 a.安装包  open jd ...

  6. 如何在CentOS 7上安装Munin

    在CentOS 7上安装Munin 首先我们需要在我们的系统中添加EPEL仓库. yum install epel-release 步骤2.安装LAMP(Linux,Apache,MariaDB,PH ...

  7. 实现div里的内容垂直居中

    ---恢复内容开始--- 在项目中我们会遇到这种情况,一个div的宽固定,里面的内容长度不定,不管是一行还是多行,都要垂直居中,有俩个实现方法: 1.使用absolute,top:50%,transf ...

  8. PHP替换指定字符串

    在PHP中,有两个函数可以实现字符串替换,strtr()和str_repalce()函数. 首先我们简单了解下strtr()函数的定义及语法. strtr:转换指定字符. 两个语法: 第一种语法: s ...

  9. Guice 依赖绑定

    Guice 依赖绑定 连接绑定(Linked Bingdings) 连接绑定是 Guice 最基本的一种绑定方式.这种绑定方式我们需要在自己定义的 Module 的 configure() 中编写绑定 ...

  10. 关于git中Pageant开机启动且自动关联秘钥

    Pageant在git中主要负责和服务器端进行身份验证,但是我们每次在启动Pageant后都需要手动的加载秘钥文件,这其实是一个比较烦的过程,我们怎么能够使其自动的完成呢? 一.Pageant开机启动 ...