[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;
}
全部评论

相关推荐

我是小红是我:学校换成中南
点赞 评论 收藏
分享
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务