zoukankan      html  css  js  c++  java
  • 欧拉路径

    参考https://www.cnblogs.com/wkfvawl/p/9626163.html https://www.cnblogs.com/Rorschach-XR/p/11795094.html

    前言

    学习本算法的机缘是昨天的杂题选讲里涵盖了一道(noip)模拟测试5的T1,然后我因为忘记欧拉回路的东西就全完了

    定义

    如果图G(有向图或者无向图)中所有边一次仅且一次行遍所有顶点的通路称作欧拉通路。

    如果图G中所有边一次仅且一次行遍所有顶点的回路称作欧拉回路。

    具有欧拉回路的图称为欧拉图(简称E图)。具有欧拉通路但不具有欧拉回路的图称为半欧拉图。

    一次行遍所有顶点不代表每个顶点只能够经过一次

    存在条件

    无向图存在欧拉路径的条件:所有点度数都是偶数,或者仅有一对度数为奇数

    有向图存在欧拉路径的条件:所有点入度等于出度,或者仅有一对点入度和出度差分别为+1,-1

    求解方式

    当前弧优化

    https://loj.ac/problem/2162

    //13:57
    //14:12
    #include<bits/stdc++.h>
    using namespace std;
    const int N=3e6+50;
    inline int rd(register int x=0,register char ch=getchar(),register int f=0){
    	for(;!isdigit(ch);ch=getchar()) f=ch=='-';
    	for(;isdigit(ch);ch=getchar()) x=(x<<1)+(x<<3)+ch-48;
    	return f?-x:x;
    }
    int n,m,B,Bcc;
    int head[N],to[N<<1],nxt[N<<1],deg[N],stk[N],ins[N],vis[N];
    vector<int> vec[N];
    
    
    void lnk(int x,int y){
    	to[++B]=y,nxt[B]=head[x],head[x]=B,deg[x]++;
    	to[++B]=x,nxt[B]=head[y],head[y]=B,deg[y]++;
    }
    void dfs(int x){
    	if(ins[x]){
    		vec[++Bcc].clear();int y;vec[Bcc].push_back(x);
    		do ins[y=stk[stk[0]--]]=0,deg[y]-=2,vec[Bcc].push_back(y);
    		while(y!=x);
    	}
    	ins[stk[++stk[0]]=x]=1;
    	for(int &i=head[x];i;i=nxt[i])if(!vis[i]){
    		vis[i]=vis[i^1]=1;
    		dfs(to[i]);
    		return;
    	}
    	
    }
    int main(){
    	n=rd();m=rd();B=1;
    	for(int i=1;i<=m;++i){
    		int a=rd(),b=rd(),s=rd(),t=rd();
    		if(s==t) continue;
    		lnk(a,b);
    	}
    	for(int i=1;i<=n;++i) if(deg[i]&1) return puts("NIE"),0;
    	for(int i=1;i<=n;++i) while(deg[i]) dfs(i);
    	printf("%d
    ",Bcc);
    	for(int i=1;i<=Bcc;++i){
    		printf("%d ",vec[i].size()-1);
    		for(auto x:vec[i]) printf("%d ",x);
    		puts("");
    	}
    }
    
  • 相关阅读:
    oracle中查询或插入特殊字符
    html最多显示两行,css 实现两行或多行文本溢出显示省略号(...)
    RT
    发表一个自己做的WPF游戏
    用silverlight制作自己的GIS
    一个字符串切割问题
    Oracle所有者权限与调用者权限(转)
    Oracle角色权限的使用事项(转)
    Tomcat 内存溢出 详解
    forms验证:怎么验证两种身份?
  • 原文地址:https://www.cnblogs.com/hzoi2018-xuefeng/p/12898612.html
Copyright © 2011-2022 走看看