ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

欧拉路与欧拉回路

2021-04-05 17:03:45  阅读:166  来源: 互联网

标签:ch vis int ++ 回路 include 欧拉


1欧拉回路与欧拉路

1.1定义

  1. 给定一张无向图,若存在一条从s到t的路径,恰好不重不漏的经过每条边一次,则称改路径为s到t的欧拉路。
  2. 特别的,若存在一条从s到s的欧拉路,则称该路径为欧拉回路,存在欧拉回路的图被称为欧拉图。

2.1定理

  1. 欧拉图:一张无向图为欧拉图,当且仅当无向图连通,并且每个点的度数都是偶数。
  2. 欧拉图=路的存在性判定:一张无向图存在欧拉路,当且仅当无向图联通,并且图中恰好有两个节点的度数为奇数,其他节点的度数都是偶数,这两个度数为奇数的节点就是欧拉路的起点s和t。

2求欧拉回路:

注意:

  1. 用栈完成拼接
  2. 用栈模拟递归
  3. 注意类似于“当前弧优化”
  4. 输出时倒着输出
  5. 时间复杂度:\(O(N+M)\)

代码:

inline void ouler(){
    stack[++top]=1;
    while(top>0){
        int x=stack[top],i=head[x];
        while(i&&vis[i]) i=next[i];
        if(i){
            stack[++top]=ver[i];;
            vis[i]=vis[i^1]=1;
            head[x]=next[i];
        }
        else{
            top--;
            ans[++t]=x;
        }
    }
} 

for(int i=t;i>=1;i--) printf("%d",ans[i]);

3例题:

P1333

欧拉路的裸题,提醒:用引用来优化map,不用来回调用。

代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<sstream>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<deque>
#include<cstdlib>
#include<ctime>
#define dd double
#define ld long double
#define ll long long
#define ull unsigned long long
#define N 601000
#define M 601000
using namespace std;

const int INF=0x3f3f3f3f;

inline ll read(){
	ll x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}

struct edge{
    int to,next;
    inline void intt(int to_,int ne_){
        to=to_;next=ne_;
    }
};
edge li[M];
int head[N],tail;

inline void add(int from,int to){
    li[++tail].intt(to,head[from]);
    head[from]=tail;
}

map<string,int> Map;
int tot;

int d[N],sum;
bool vis[N];

inline void dfs(int k){
    vis[k]=1;
    for(int x=head[k];x;x=li[x].next){
        int to=li[x].to;
        if(vis[to]) continue;
        dfs(to);
    }
}

int main(){
    while(1){
        string s1,s2;
        cin>>s1>>s2;
        if(s1=="\000") break;
        int &from=Map[s1],&to=Map[s2];
        if(!from) from=++tot;
        if(!to) to=++tot;
        add(from,to);add(to,from);
        d[from]++;d[to]++;
    }
    dfs(1);
    for(int i=1;i<=tot;i++){
        if(!vis[i]){
            printf("Impossible\n");
            return 0;
        } 
        if(d[i]%2==1) sum++;
    }
    if(sum!=2&&sum!=0){
        printf("Impossible\n");
        return 0;
    }
    printf("Possible\n");
    return 0;
}

标签:ch,vis,int,++,回路,include,欧拉
来源: https://www.cnblogs.com/TianMeng-hyl/p/14618732.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有