1.判断是否为欧拉存在欧拉回路---裸的判断

欧拉回路就是看一笔能不能把途中所有的边跑完没得重复

对于无向边----建立双向边判断每个点的入度是否为2的倍数   1.1

对于有向边---建立单向边判断每个点的入度与出度是否相等   1.2

然后就是看一下是否所有的点是否连接----可以用并查集或者dfs判断,具体看情况来定。 2

判断是否存在欧拉回路,就是同时满足上边的1,2两个条件

HDU 1878代码 并查集 条件1.1+2

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<math.h>
#include<set>
#include<stack>
#include<vector>
#include<map>
#include<queue>
#define myself i,l,r
#define lson i<<1
#define rson i<<1|1
#define Lson i<<1,l,mid
#define Rson i<<1|1,mid+1,r
#define half (l+r)/2
#define inff 0x3f3f3f3f
#define lowbit(x) x&(-x)
#define me(a,b) memset(a,b,sizeof(a))
#define min4(a,b,c,d) min(min(a,b),min(c,d))
#define min3(x,y,z) min(min(x,y),min(y,z))
#define max4(a,b,c,d) max(max(a,b),max(c,d))
#define max3(x,y,z) max(max(x,y),max(y,z))
typedef long long ll;
using namespace std;
const int maxn=1005;
int f[maxn],vis[maxn];
int n,m;
void init()
{for(int i=1;i<=n;i++){vis[i]=0;f[i]=i;}
}
int find(int x)
{if(x==f[x]) return x;else return f[x]=find(f[x]);
}
void unionn(int x,int y)
{int fx=find(x);int fy=find(y);if(fx!=fy)f[x]=y;
}
int main()
{int x,y;while(cin>>n,n){cin>>m;init();for(int i=1;i<=m;i++){scanf("%d %d",&x,&y);unionn(x,y);vis[x]++;vis[y]++;}bool flag=true;int cnt=0;for(int i=1;i<=n;i++){if(f[i]==i)cnt++;}if(cnt>1)flag=false;else{for(int i=1;i<=n;i++)if(vis[i]%2==1){flag=false;break;}}if(flag)printf("1\n");elseprintf("0\n");}return 0;
}

2。输出欧拉回路 uoj 117

分两种情况建立单向或者双向边

判断1.1 or 1.2 ,然后用dfs来进行遍历,如果能够遍历所有的边,那么输出即可

但是这道题的数据很大很坑,存在的问题就是可能会出现自环,比如给了10000组的 1 1边,那么dfs的时候遍历是会超时的,利用邻接表的性质进行优化

代码如下

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<math.h>
#include<set>
#include<stack>
#include<vector>
#include<map>
#include<queue>
#define myself i,l,r
#define lson i<<1
#define rson i<<1|1
#define Lson i<<1,l,mid
#define Rson i<<1|1,mid+1,r
#define half (l+r)/2
#define inff 0x3f3f3f3f
#define lowbit(x) x&(-x)
#define me(a,b) memset(a,b,sizeof(a))
#define min4(a,b,c,d) min(min(a,b),min(c,d))
#define min3(x,y,z) min(min(x,y),min(y,z))
#define max4(a,b,c,d) max(max(a,b),max(c,d))
#define max3(x,y,z) max(max(x,y),max(y,z))
typedef long long ll;
const double pi=acos(-1.0);
const double E=2.718281828459;
using namespace std;
const int maxn=1e5+5;
const int maxm=2e5+5;
struct node
{int to,p,vis;
}edge[maxm<<1];
int n,m;
int in[maxn],out[maxn];
int head[maxn],sign,cnt;
void add(int u,int v)
{edge[++sign]=node{v,head[u],0};head[u]=sign;
}
void init()
{cnt=sign=0;memset(head,-1,sizeof(head));for(int i=1;i<=n;i++)in[i]=out[i]=0;
}
int ans[maxm];
void dfs_unedge(int u)
{for(int i=head[u];~i;i=head[u])//这里就是优化的地方{head[u]=edge[i].p;//譬如起始点u点连接了10000个点  u->1>2>3>4>5>.........//那么我一下循环到u点的时候,它又要从1,2,3,4,5一个一个判断之前是否走过//而现在当我们从u走到过1这个位置后,head[u]=head[1],那么u->1这条边就不在判断了//也就是说走过一条边这条边下次就不再走了,那么复杂度就是O(m)int v=edge[i].to;if(edge[i].vis)continue;edge[i].vis=1;if(i&1)edge[i+1].vis=1;elseedge[i-1].vis=1;dfs_unedge(v);ans[++cnt]=(i+1)/2;if(i%2==0)ans[cnt]*=-1;}
}
void dfs_diredge(int u)
{for(int i=head[u];~i;i=head[u]){head[u]=edge[i].p;int v=edge[i].to;if(edge[i].vis==0){edge[i].vis=1;dfs_diredge(v);ans[++cnt]=i;}}
}
int main()
{int t,x,y;scanf("%d%d%d",&t,&n,&m);init();for(int i=1;i<=m;i++){scanf("%d%d",&x,&y);add(x,y);if(t==1){add(y,x);in[x]++;in[y]++;}else{out[x]++;in[y]++;}}if(t==1)//条件1.1{for(int i=1;i<=n;i++)if(in[i]&1)return !printf("NO\n");}else//条件1.2{for(int i=1;i<=n;i++)if(in[i]!=out[i])return !printf("NO\n");}if(t==1) dfs_unedge(x);//else dfs_diredge(x);if(cnt!=m)//条件2printf("NO\n");else{printf("YES\n");for(int i=cnt;i>=1;i--)printf("%d ",ans[i]);}return 0;
}

uoj 117 欧拉回路相关推荐

  1. UOJ - #117. 欧拉回路(模板)

    题目链接:点击查看 题目大意:给出一个 nnn 个点 mmm 条边的图,可能是有向图或无向图,求一条欧拉回路 题目分析:有个小坑点就是图必须是联通的 代码: // Problem: #117. 欧拉回 ...

  2. UOJ #117. 欧拉回路

    #117. 欧拉回路 在图中找一个环使得每条边都在环上出现恰好一次. 要注意的地方好多啊 每条边恰好出现一次!!! 条件:每个点偶度 / 入度=出度 方法就是套圈法啦 然后本题自环是合法的,如果200 ...

  3. UOJ 117 欧拉回路(套圈法+欧拉回路路径输出+骚操作)

    题目链接:http://uoj.ac/problem/117 题目大意: 解题思路:先判断度数: 若G为有向图,欧拉回路的点的出度等于入度. 若G为无向图,欧拉回路的点的度数位偶数. 然后判断连通性, ...

  4. UOJ.117.欧拉回路

    题目链接 这数据..简直了 有自环和重边,有些点可能没有连边(并查集不好使 就DFS吧) 因为重边+自环可能非常多,同一个点可能经过n次,所以必须要重置表头H[x](类似当前弧优化) 另外是找欧拉回路 ...

  5. uoj #117. 欧拉回路 圈套圈算法求欧拉回路

    题意 给你一个有向图或无向图,要求输出其中一条欧拉回路. n≤100000 n ≤ 100000 n\le100000 分析 圈套圈算法求欧拉回路的模版题. 这个算法大概是,从某个点开始走,然后用一个 ...

  6. uoj #117. 欧拉回路 套圈法

    题面 题意 给出一幅有向或无向图,判断是否存在一个环走遍所有边,若有则输出求其中的环. 做法 首先判断很容易,对于无向图只要联通且度数都是偶数即可,对于有向图,则要联通且入度等于出度,问题在于如何找到 ...

  7. 一本通1527欧拉回路

    1527:[例 1]欧拉回路 时间限制: 1000 ms         内存限制: 262144 KB [题目描述] 原题来自:UOJ #117 有一天一位灵魂画师画了一张图,现在要你找出欧拉回路, ...

  8. 连通域最小外接矩形算法原理_算法|图论 2W字知识点整理(超全面)

    作者:SovietPower✨ 链接:https://ac.nowcoder.com/discuss/186584 来源:牛客网 度数序列 对于无向图, 为每个点的度数.有 (每条边被计算两次).有偶 ...

  9. 【UOJ#389】【UNR#3】白鸽(欧拉回路,费用流)

    [UOJ#389][UNR#3]白鸽(欧拉回路,费用流) 题面 UOJ 题解 首先第一问就是判断是否存在一条合法的欧拉回路,这个拿度数和连通性判断一下就行了. 第二问判断转的圈数,显然我们只需要考虑顺 ...

最新文章

  1. 过早扩张、未经检验的技术,创业公司最易跳入哪些致命陷阱?
  2. ORACLE数据库表空间备份方案
  3. 操作系统:经典进程同步问题 之 生产者-消费者问题、读者-写者问题、哲学家进餐问题
  4. CSS选择器详解(一)常用选择器
  5. 中国版的stackoverflow
  6. WinDbg学习笔记(一)--认识WinDbg
  7. 有序数组中查找第一个比target大的数
  8. oracle10客户端tnsname,连接Oracle RAC 的tnsname.ora设置
  9. java必知必会_Java构造器必知必会
  10. 又一所“国字头”大学要来?屠呦呦也在
  11. OCS UCCA 开发笔记(Unified Communications Client API)
  12. List小心性能损失的方法
  13. python输入数据带单位_python – Pandas用单位插入数据
  14. 请你谈谈IP地址和MAC地址关系,为何需要两个地址?
  15. CSP J/S SH 迷惑行为大赏
  16. DiskGenius安装教程
  17. python3打造一款游戏辅助软件
  18. sas univariate 结果解释_SAS 常用过程之 PROC UNIVARIATE
  19. DB-RANK国内数据库权威排行出炉:OMS三足鼎立,达梦数据库排第七
  20. 深度学习:神经网络中的激活函数

热门文章

  1. 微信小程序填坑之路(三):布局适配方案(rpx、px、vw、vh)
  2. 13装饰器和内置函数
  3. java中数组的复制
  4. 谈谈对web标准的理解
  5. Planetary.js:帮助你构建超炫的互动球体效果
  6. 智能会议白板系统每日开发记录
  7. SQL 2005 删除带有默认值约束的列
  8. ASP.NET常用函数
  9. win7查看电脑上openCV的版本
  10. xdoj 1114(线段树离线处理)