[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\n",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("\n");
}
return 0;
}