[POI2011]Śmieci
[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的更多相关文章
- BZOJ2527: [Poi2011]Meteors
		
补一发题解.. 整体二分这个东西,一开始感觉复杂度不是很靠谱的样子 问了po姐姐,说套主定理硬干.. #include<bits/stdc++.h> #define ll long lon ...
 - BZOJ2276: [Poi2011]Temperature
		
2276: [Poi2011]Temperature Time Limit: 20 Sec Memory Limit: 32 MBSubmit: 293 Solved: 117[Submit][S ...
 - BZOJ2213: [Poi2011]Difference
		
2213: [Poi2011]Difference Time Limit: 10 Sec Memory Limit: 32 MBSubmit: 343 Solved: 108[Submit][St ...
 - BZOJ2212: [Poi2011]Tree Rotations
		
2212: [Poi2011]Tree Rotations Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 391 Solved: 127[Submi ...
 - BZOJ 2212: [Poi2011]Tree Rotations( 线段树 )
		
线段树的合并..对于一个点x, 我们只需考虑是否需要交换左右儿子, 递归处理左右儿子. #include<bits/stdc++.h> using namespace std; #defi ...
 - bzoj 2217 [Poi2011]Lollipop 乱搞 贪心
		
2217: [Poi2011]Lollipop Time Limit: 15 Sec Memory Limit: 64 MBSec Special JudgeSubmit: 383 Solved ...
 - BZOJ_2529_[Poi2011]Sticks_贪心
		
BZOJ_2529_[Poi2011]Sticks_贪心 Description Little Johnny was given a birthday present by his grandpare ...
 - BZOJ_2212_[Poi2011]Tree Rotations_线段树合并
		
BZOJ_2212_[Poi2011]Tree Rotations_线段树合并 Description Byteasar the gardener is growing a rare tree cal ...
 - BZOJ_2527_[Poi2011]Meteors_整体二分
		
BZOJ_2527_[Poi2011]Meteors_整体二分 Description Byteotian Interstellar Union (BIU) has recently discover ...
 
随机推荐
- springboot系列六、springboot配置错误页面及全局异常
			
一.spring1.x中处理方式 @Bean public EmbeddedServletContainerCustomizer containerCustomizer() { return new ...
 - (常用)subprocess模块 详情官方
			
subprocess包中定义有数个创建子进程的函数,这些函数分别以不同的方式创建子进程,所以我们可以根据需要来从中选取一个使用.另外subprocess还提供了一些管理标准流(standard str ...
 - 解决报错error the @annotation pointcut expression is only supported at Java 5
			
eclipse搭建环境后报错 error the @annotation pointcut expression is only supported at Java 5 错误意思大致是:注释切入点表达 ...
 - Android:自定义Dialog
			
自定义Dialog:显示SeekBar 效果图: 步骤: //SettingActivity.java button4.setOnClickListener(new View.OnClickListe ...
 - caffe:fine-tuning
			
http://blog.csdn.net/u010402786/article/details/70141261 https://zhuanlan.zhihu.com/p/22624331
 - 详解用webpack的CommonsChunkPlugin提取公共代码的3种方式(注意webpack4.0版本已不存在)
			
Webpack 的 CommonsChunkPlugin 插件,负责将多次被使用的 JS 模块打包在一起. CommonsChunkPlugin 能解决的问题 在使用插件前,考虑几个问题: 对哪些 c ...
 - C++ code:函数指针数组
			
函数指针作为一种数据类型,当然可以作为数组的元素类型.例如,要实现用菜单来驱动函数调用的程序框架,则用函数指针数组来实现就比较容易维护. #include<iostream> using ...
 - jquery----用户密码验证
			
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
 - poj1015 01二维背包
			
/* 给定辩控双方给每个人的打分p[i],d[i], dp[j][k]表示前i个人有j个被选定,选定的人的辩控双方打分差之和是k,此状态下的最大辩控双方和 按01背包做,体积一维是1,体积二维是辩控双 ...
 - 线上Slave报1062的案例
			
最近经常线上的Slave老报1062的错误,蛋碎一地,幸好Slave暂时没有用到业务上,也就是说没有做读写分离,所以Slave有问题,影响也不大,但每隔一阵子就报1062主键冲突的错误,让我好纠结,如 ...