欧拉回路

来源:互联网 发布:鸡汤网络中是什么意思 编辑:程序博客网 时间: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