ICode9

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

欧拉图

2021-09-03 08:32:42  阅读:155  来源: 互联网

标签:通路 int start 回路 include 欧拉


欧拉图

  • 欧拉通路
  • 欧拉回路

定义

欧拉通路 (欧拉迹): 通过图中每条边且只通过一次,并且经过每一顶点的通路。

**欧拉回路 (欧拉闭迹): ** 通过图中每条边且只通过一次,并且经过每一顶点的回路。

**欧拉图: ** 存在欧拉回路的图。

无向图是否具有欧拉通路或回路的判定

欧拉通路

只有 2 个度为奇数的节点 (就是欧拉通路的 2 个端点)。

欧拉回路

所有节点度均为偶数。

有向图是否具有欧拉通路或回路的判定

欧拉通路

除 2 个端点外其余节点入度 = 出度;

终点入度比出度大 1,起点入度比出度小 1。

欧拉回路

所有节点入度 = 出度

有向图寻找找欧拉路径 & 回路

P7771 【模板】欧拉路径

/*
work by:Ariel_
Sorce:
Knowledge:欧拉路径 
Time:
*/
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <stack>
#define ll long long
#define rg register
using namespace std;
const int MAXN = 1e6 + 5; 
int read(){
    int x = 0,f = 1; char c = getchar();
    while(c < '0'||c > '9') {if(c == '-') f = -1; c = getchar();}
    while(c >= '0' && c <= '9') {x = x*10 + c - '0'; c = getchar();}
    return x*f;
}
int n, m, ind[MAXN], out[MAXN], cnt1, cnt2, st = 1, start[MAXN], fag;
vector<int>e[MAXN];
stack<int> s;
void dfs(int x) {
   for (int i = start[x]; i < e[x].size(); i = start[x]) {
   	   int v = e[x][i];
   	   start[x] = i + 1;
   	   dfs(v);
   }
   s.push(x);
}
int main(){
   n = read(), m = read();
   for (int i = 1; i <= m; i++) {
   	 int u = read(), v = read();
   	 ind[v]++, out[u]++;
     e[u].push_back(v);  
   }
   for (int i = 1; i <= n; i++) {
   	  if(ind[i] != out[i]) { fag = 1;
   	    if(ind[i] + 1 == out[i]) st = i, cnt1++;
		else if(ind[i] == out[i] + 1) cnt2++;
	  }
   }
   if(!(!fag || (cnt1 == cnt2 && cnt1 == 1)))  {printf("No\n"); return 0;} 
   for (int i = 1; i <= n; i++) sort(e[i].begin(), e[i].end());
   dfs(st);
   while(!s.empty()) {
   	  printf("%d ", s.top());
   	  s.pop();
   }
   return 0;
}

无向图寻找欧拉路径&回路

P2731 [USACO3.3]骑马修栅栏 Riding the Fences

/*
work by:Ariel_
Sorce:
Knowle:无向图欧拉路径, 回路 
Time:O(nlogn)
*/
#include <iostream>
#include <cstring>
#include <cstdio>
#include <stack>
#include <algorithm>
#include <vector>
#include <map>
#define ll long long
#define rg register
using namespace std;
const int MAXN = 1100;
int read(){
    int x = 0,f = 1; char c = getchar();
    while(c < '0'||c > '9') {if(c == '-') f = -1; c = getchar();}
    while(c >= '0' && c <= '9') {x = x*10 + c - '0'; c = getchar();}
    return x*f;
}
int m, n, ind[MAXN], st, start[MAXN];
vector<int>e[MAXN];
map<pair<int, int>, int> mp;
stack<int> ans;
void dfs(int x) {
   while(1) {
   	 while(start[x] < e[x].size() && !mp[make_pair(x, e[x][start[x]])]) start[x]++;
   	 if(start[x] >= e[x].size()) break;
   	 int v = e[x][start[x]];
   	 mp[make_pair(x, v)]--; 
   	 mp[make_pair(v, x)]--; 
	 start[x]++;
	 dfs(v);
   }
   ans.push(x);
}
int main(){
   m = read(), st = n = 500;
   for (int i = 1; i <= m; i++) {
   	 int u = read(), v = read();
   	 ind[u]++, ind[v]++;
     st = min(st, min(u, v));
     e[u].push_back(v), e[v].push_back(u);
     mp[make_pair(u, v)]++, mp[make_pair(v, u)]++;
   }
   for (int i = 1; i <= n; i++) sort(e[i].begin(), e[i].end());
   for (int i = 1; i <= n; i++) if(ind[i] & 1) {st = i; break;}
   dfs(st);  
   while(!ans.empty()) {
   	 printf("%d\n", ans.top());
   	 ans.pop();
   }
   puts("");
   return 0;
}

标签:通路,int,start,回路,include,欧拉
来源: https://www.cnblogs.com/Arielzz/p/15221220.html

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

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

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

ICode9版权所有