欧拉回路
来源:互联网 发布:鸡汤网络中是什么意思 编辑:程序博客网 时间:2024/04/30 12:41
欧拉回路:图G,若存在一条路,经过G中每条边有且仅有一次,称这条路为欧拉路,如果存在一条回路经过G每条边有且仅有一次,称这条回路为欧拉回路。具有欧拉回路的图成为欧拉图.
判断欧拉回路是否存在的方法
有向图:图连通,所有的顶点出度=入度。
无向图:图连通,所有顶点都是偶数度。
在这里用深度优先搜索算法来实现,从任意点U出发,经过未经过的边线,生成最终路径。
程序中使用的是邻接表(已经赋值好了),从初始节点u开始,找到一个未访问的节点v,同时将邻接表中(u,v)和(v,u)的值减一(这样走过的路就不会再走,使得每条边只走一次)。递归调用搜索方法设置初始节点为v。当搜索到最终节点时,依次按照节点访问终止顺序将节点添加到vector中,vector中存储的就是访问路径的逆序,如果vector中首位节点相同,那么存在欧拉回路。
代码(无向图)–有向图也类似,只要将getEulerCircuit方法中改为adj[here][there]–即可,同邻接表也只添加一个方向就可
#include <iostream>#include <vector>using namespace std;//深度优先搜索寻找欧拉回路void getEulerCircuit(int here,vector<int>& circuit,vector<vector<int>>& adj){ for(int there=0; there<adj.size(); ++there) { while(adj[here][there]>0) { adj[here][there]--; adj[there][here]--; getEulerCircuit(there,circuit,adj); } } circuit.push_back(here+1);}int main(){ int m=0,n=0; //n:节点数,m:边数 cin>>n; if(n==0) return 0; cin>>m; while(n!=0) { //nxn维的数组 vector<vector<int>> adj(n, vector<int>(n,0)); //输入边(连通两条边的序号) for(int i=0; i<m; i++) { int a=0,b=0; cin>>a>>b; adj[a-1][b-1]=1; adj[b-1][a-1]=1; } vector<int> circuit; getEulerCircuit(0,circuit,adj); int num=circuit.size(); if(circuit[0]==circuit[num-1]) { cout<<1<<endl; } else cout<<0<<endl; cin>>n; if(n==0) break; cin>>m; } return 0;}
0 0
- HDU1878 欧拉回路【欧拉回路】
- 欧拉回路判断
- 欧拉回路 hdu1878
- 欧拉回路
- 欧拉回路
- 欧拉回路
- 欧拉回路,欧拉路
- 欧拉回路
- 欧拉回路
- 欧拉回路
- 欧拉回路
- 欧拉回路
- 欧拉回路
- 欧拉回路
- 图论 欧拉回路
- zju2008欧拉回路
- 欧拉回路
- hdu1878欧拉回路
- Python 核心编程笔记_Chapter_2 Note_3_赋值与变量_字符串_列表list_元组tuple_字典dict
- iOS直播技术分析与实现
- HDOJ 3430 Shuffling
- Android&&Unity交互——同一个apk
- 大一数据库系统概论期末复习参考
- 欧拉回路
- Java application—SS2.1
- fuel: 安装onos的两种节点选择方式
- ERP项目实施记录11-产品工艺流程图及单据关联图
- SOL_SOCKET、IPPROTO_IP、IPPROTO_TCP和NSPROTO_IPX选项级别
- 递归解n皇后
- UEditor中添加视频
- Linux设备模型(热插拔、mdev 与 firmware)
- java app版本号对比