欧拉回路判定与求解

图G是欧拉图,即存在欧拉回路的条件::smile:

1.图是联通的

2.对于无向图,奇度数点个数为0。对于有向图,每个顶点出度等于入度。

欧拉回路算法模板(链式前向星和DFS实现):


int ans[N];
int k = 0;
int vis[2*M];

void DFS(int now)
{
for(int u=first[now];u!=-1;u=G[u].next)
{
if(!vis[u])
{
vis[u] = 1; //标记当前边
vis[u^1] = 1; //标记反向的另一条边
DFS(G[u].v);
ans[k++] = k;
}
}
}

模板题 POJ 2230 Watchcow

把无向图看成有向图,求其欧拉回路。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define N 100007

struct Edge
{
int v,next;
}G[N];
int n,m,tot;
int first[10005];
int vis[N];

void addedge(int u,int v)
{
G[tot].v = v;
G[tot].next = first[u];
first[u] = tot++;
}

void DFS(int now)
{
for(int u=first[now];u!=-1;u=G[u].next)
{
if(!vis[u])
{
vis[u] = 1; //标记当前边
DFS(G[u].v);
}
}
printf("%d\n",now);
}

int main()
{
int u,v;
tot = 0;
scanf("%d%d",&n,&m);
memset(first,-1,sizeof(first));
while(m--)
{
scanf("%d%d",&u,&v);
addedge(u,v);
addedge(v,u);
}
DFS(1);
return 0;
}

欧拉回路判定与求解,布布扣,bubuko.com

时间: 2024-10-07 05:43:22

欧拉回路判定与求解的相关文章

混合图的欧拉回路判定

对于有向图和无向图的欧拉回路判定,很容易做到.那对于混合图呢?? 混合图就是图中既存在无向边又存在有向边的图. 至于解法: 转载自这里 把该图的无向边随便定向,计算每个点的入度和出度.如果有某个点出入度之差为奇数,那么肯定不存在欧拉回路.因为欧拉回路要求每点入度 = 出度,也就是总度数为偶数,存在奇数度点必不能有欧拉回路. 好了,现在每个点入度和出度之差均为偶数.那么将这个偶数除以2,得x.也就是说,对于每一个点,只要将x条边改变方向(入>出就是变入,出>入就是变出),就能保证出 = 入.如果

POJ 1041 John&#39;s trip Euler欧拉回路判定和求回路

就是欧拉判定,判定之后就可以使用DFS求欧拉回路了.图论内容. 这里使用邻接矩阵会快很多速度. 这类题目都是十分困难的,光是定义的记录的数组变量就会是一大堆. #include <cstdio> #include <cstring> #include <stack> #include <vector> using namespace std; struct Edge { int ed, des; Edge(int e = 0, int d = 0) : ed

POJ 1637 混合图的欧拉回路判定

题意:一张混合图,判断是否存在欧拉回路. 分析参考: 混合图(既有有向边又有无向边的图)中欧拉环.欧拉路径的判定需要借助网络流! (1)欧拉环的判定:一开始当然是判断原图的基图是否连通,若不连通则一定不存在欧拉环或欧拉路径(不考虑度数为0的点). 其实,难点在于图中的无向边,需要对所有的无向边定向(指定一个方向,使之变为有向边),使整个图变成一个有向欧拉图(或有向半欧拉图).若存在一个定向满足此条件,则原图是欧拉图(或半欧拉图)否则不是.关键就是如何定向? 首先给原图中的每条无向边随便指定一个方

ACM/ICPC 之 混合图的欧拉回路判定-网络流(POJ1637)

//网络流判定混合图欧拉回路 //通过网络流使得各点的出入度相同则possible,否则impossible //残留网络的权值为可改变方向的次数,即n个双向边则有n次 //Time:157Ms Memory:348K #include <iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<queue> using namespace std; #de

poj1637 Sightseeing tour 混合图欧拉回路判定

传送门 第一次做这种题, 尽管ac了但是完全不知道为什么这么做. 题目就是给一些边, 有向边与无向边混合, 问你是否存在欧拉回路. 做法是先对每个点求入度和出度, 如果一条边是无向边, 就随便指定一个方向, 然后连一条边, 权值为1. 最后统计入度出度, 如果一个点的(入度-出度)%2==1, 就说明不存在欧拉回路. 如果全都满足, 就判断每个点的入度出度的大小关系, 入度>出度, 就向汇点连一条边, 权值为(入度-出度)/2, 相反的话就向源点连边. 跑一遍最大流, 看是否满流, 如果满流就说

HDOJ 欧拉回路 1878【欧拉回路判定】

欧拉回路 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 10459    Accepted Submission(s): 3815 Problem Description 欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路.现给定一个图,问是否存在欧拉回路? Input 测试输入包含若干测试用例.每个测试用例

poj 1386 欧拉回路判定

奇怪的是,我的判定是不是联通的部分出问题了 先贴个对的: #include <cstdio> #include <map> #include <cstring> #include <string> #include <iostream> using namespace std; const int SIZE = 100000+10; const int SSIZE = 1000 +10; const int tb = 26; int idx(ch

POJ 1637 Sightseeing tour 混合图欧拉回路存在性判断

没有想到网络流还能解决这一类问题,完全想不到@[email protected] 一开始把所有的无向边制定任意方向有当做有向边看,然后统计每个点的入度和出度.以前有向图的欧拉回路判定是每个点的入读都等于出度,这样可以保证可以回到起点,现在在一些边可以调换方向的情况下,所有定点的入度和出度之差必定为偶数,因为调换任意一条边的方向都会使两个定点的入度和出度变化2,所以要构成一个欧拉回路所有点的入度和出度之差都为偶数,并设差为deg. 现在问题转化成了能否通过改变一些边的方向来是的所有点的入度出度都为

POJ 2513 Colored Sticks(欧拉回路,字典树,并查集)

题意:给定一些木棒,木棒两端都涂上颜色,求是否能将木棒首尾相接,连成一条直线,要求不同木棒相接的一边必须是相同颜色的. 转:kuangbing 无向图存在欧拉路的充要条件为: ①     图是连通的: ②     所有节点的度为偶数,或者有且只有两个度为奇数的节点. 图的连通可以利用并查集去判断. 度数的统计比较容易. view code//第一次用指针写trie,本来是用二维数组,发现数组开不下,只好删删改改,改成指针 //做这道题,知道了欧拉回路判定,还有用指针写trie #include