POJ 1041 John'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(e), des(d) {}
};
const int EDGES = 2000;//1996;
const int VEC = 45;
stack<int> stk;
int degree[VEC];
vector<Edge> gra[VEC];
bool vis[EDGES];

void euler(int u)
{
	for(int i = 0; i < (int)gra[u].size(); i++)
	{
		if(!vis[gra[u][i].ed])	//标志访问过了,这里需要表示桥,不是顶点
		{
			vis[gra[u][i].ed] = true;
			euler(gra[u][i].des);
			stk.push(gra[u][i].ed);
			//不能break
		}
	}
}

int main()
{
	int x, y, z, one;
	while (scanf("%d %d", &x, &y) != EOF && x && y)
	{
		memset(vis, 0, sizeof(vis));
		memset(degree, 0, sizeof(degree));
		for (int i = 1; i < VEC; i++)
			gra[i].clear();

		scanf("%d", &z);
		one = min(x, y);
		degree[x]++; degree[y]++;
		gra[x].push_back(Edge(z, y)); gra[y].push_back(Edge(z, x));
		while (scanf("%d %d", &x, &y) != EOF && x && y)
		{
			scanf("%d", &z);
			gra[x].push_back(Edge(z, y)); gra[y].push_back(Edge(z, x));
			degree[x]++, degree[y]++;
		}
		for (int i = 1; i < VEC; i++)
		{
			if (degree[i] & 1)
			{
				puts("Round trip does not exist.");
				goto endLoop;	//玩玩goto
			}
		}

		euler(one);
		while (!stk.empty())
		{
			printf("%d ", stk.top());
			stk.pop();
		}
		putchar('\n');

		endLoop:;
	}
	return 0;
}

POJ 1041 John's trip Euler欧拉回路判定和求回路

时间: 2024-08-10 19:11:23

POJ 1041 John's trip Euler欧拉回路判定和求回路的相关文章

POJ 1041 John&#39;s trip (无向图欧拉回路)

John's trip Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7433   Accepted: 2465   Special Judge Description Little Johnny has got a new car. He decided to drive around the town to visit his friends. Johnny wanted to visit all his frien

POJ 1041 John&#39;s trip 无向图的【欧拉回路】路径输出

欧拉回路第一题TVT 本题的一个小技巧在于: [建立一个存放点与边关系的邻接矩阵] 1.先判断是否存在欧拉路径 无向图: 欧拉回路:连通 + 所有定点的度为偶数 欧拉路径:连通 + 除源点和终点外都为偶数 有向图: 欧拉回路:连通 + 所有点的入度 == 出度 欧拉路径:连通 + 源点 出度-入度=1 && 终点 入度 - 出度 = 1 && 其余点 入度 == 出度: 2.求欧拉路径 : step 1:选取起点(如果是点的度数全为偶数任意点为S如果有两个点的度数位奇数取一

poj 1041 John&#39;s trip 欧拉回路

题目链接 求给出的图是否存在欧拉回路并输出路径, 从1这个点开始, 输出时按边的升序输出. 将每个点的边排序一下就可以. 1 #include <iostream> 2 #include <vector> 3 #include <cstdio> 4 #include <cstring> 5 #include <algorithm> 6 #include <cmath> 7 #include <map> 8 #include

poj1041 John&#39;s trip,无向图求欧拉回路路径

点击打开链接 无向图求欧拉回路: 1.图连通 2.所有顶点的度数位偶数 #include <cstdio> #include <cstring> #include <stack> #include <queue> #include <algorithm> using namespace std; const int mt = 2000; const int ms = 50; bool vis[mt+5]; int g[ms][mt+5]; int

poj1041 John&#39;s trip (无向图求欧拉回路方案)

John's trip Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5950   Accepted: 1946   Special Judge Description Little Johnny has got a new car. He decided to drive around the town to visit his friends. Johnny wanted to visit all his frien

欧拉回路判定与求解

图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; //标记反向的另一条边

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

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

poj 1386 Play on Words(有向图欧拉回路)

1 /* 2 题意:单词拼接,前一个单词的末尾字母和后一个单词的开头字母相同 3 思路:将一个单词的开头和末尾单词分别做两个点并建一条有向边!然后判断是否存在欧拉回路或者欧拉路 4 5 再次强调有向图欧拉路或欧拉回路的判定方法: 6 (1)有向图G为欧拉图(存在欧拉回路),当且仅当G的基图连通,且所有顶点的入度等于出度. 7 (2)有向图G为半欧拉图(存在欧拉道路),当且仅当G的基图连通,且存在顶点u的入度比出度大1.v的入度比出度小1, 8 其它所有顶点的入度等于出度(顶点u,v的个数必须都是

混合图的欧拉回路判定

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