zoukankan      html  css  js  c++  java
  • [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;
    }
    
  • 相关阅读:
    HTTP学习笔记(1)ULR语法
    wsdl地址如何在远程服务器上查看源码?
    java线程详解(三)
    java线程详解(二)
    java线程详解(一)
    java中this用法总结
    Linux运行python程序
    如何获取到Java对象的地址
    IDEA 远程调试
    linux环境中mysql默认端口3306无法连接问题排查
  • 原文地址:https://www.cnblogs.com/dsrdsr/p/10492863.html
Copyright © 2011-2022 走看看