[POI2011]Garbage 欧拉回路

[POI2011]Garbage

链接

https://www.lydsy.com/JudgeOnline/problem.php?id=2278
https://loj.ac/problem/2162
https://www.luogu.org/problemnew/show/P3520

思路

求欧拉回路
求不到就GG
不过好像复杂度不对,一直TLE
luogu90TLE
loj85TLE
bzojwrong
不过本地只跑1e7,std跑2e7

代码

#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
const int N=1e5+7,M=1e6+7;
char buf[20000001],*p1=buf,*p2=buf;
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,20000000,stdin),p1==p2)?EOF:*p1++)
int read() {
	int x=0,f=1;char s=getchar();
	for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;
	for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';
	return x*f;
}
int out_tp,out_stk[25];
void opt(int x){
	if (!x){ putchar('0'); return; }
	int t; for (; x; x=t){ t=x/10; out_stk[++out_tp]=x-t*10; }
	while (out_tp) putchar(out_stk[out_tp--]+'0');
	putchar(' ');
}
int n,m;
struct node {
	int v,nxt,q,ok;
}e[M<<1];
int head[N],tot=1;
vector<int> ans[N];
void add(int u,int v,int q) {
	e[++tot].v=v;
	e[tot].q=q;
	e[tot].nxt=head[u];
	head[u]=tot;
}
int stak[M],top,js;
bool dfs(int u,int f,int T) {
	if(u==T&&f) return true;
	for(int i=head[u];i;i=e[i].nxt) {
		int v=e[i].v;
		if(e[i].ok||!e[i].q) continue;
		e[i].q=e[i^1].q=0;
		stak[++top]=i;
		if(dfs(v,u,T)) return true;
		while(stak[top]!=i) {
			e[stak[top]^1].ok=e[stak[top]].q=1;
			e[stak[top]^1].q=e[stak[top--]].q=1;
		}
		e[i].ok=e[i^1].ok=1;
		e[stak[top]^1].q=e[stak[top--]].q=1;
	}
	return false;
}
int main() {
	// freopen("smi10a.in","r",stdin);
	n=read(),m=read();
	for(int i=1;i<=m;++i) {
		int u=read(),v=read();
		int x=read(),y=read();
		add(u,v,x^y),add(v,u,x^y);
	}
	for(int i=1;i<=n;++i) {
		int flag=0;
		for(int j=head[i];j;j=e[j].nxt) if(e[j].q) flag=1;
		if(flag) {
			if(!dfs(i,0,i)) {
				puts("NIE");
				return 0;
			}
			++js;
			while(top) ans[js].push_back(e[stak[top--]].v);
			ans[js].push_back(i);
		}
	}
	printf("%d
",js);
	for(int i=1;i<=js;++i) {
		opt(ans[i].size()-1);
		for(int j=0;j<ans[i].size();++j)
			opt(ans[i][j]);
		printf("
");
	}
	return 0;
}
原文地址:https://www.cnblogs.com/dsrdsr/p/10492863.html