1. 程式人生 > >歐拉回路--輸出歐拉回路的路徑

歐拉回路--輸出歐拉回路的路徑

//有向or無向均可,重邊

step1:從u開始,找到與他相連的v,放入棧,刪除(u,v)這條邊,然後從v開始

step2:當有一點沒有與他相連的點時,放入path,然後從stack取棧頂繼續開始找點刪邊。

最後記得把棧裡的點放到path中。

path倒序輸出

//需要先找到起點

//鄰接表法,適合稀疏圖

#include <cstdio>

#include <iostream>

#include <vector>

#include <stack>

#include <set>

usingnamespacestd;

const

int maxn =100 +5;

vector<int> mp[maxn];

multiset<int> mps[maxn];//支援重邊

int n,m;

void get_path(int s)

{

stack<int> stk;

vector<int> path;

int u = s,v;

    stk.push(u);

int  cnt =0;

for(;;)

    {

if(!mps[u].empty())

        {

            v = *mps[u].begin();

            stk.

push(v);

mps[u].erase(mps[u].begin());

// mps[v].erase(mps[v].find(u));//無重邊的無向圖,要刪除(vu

// mps[v].erase(mps[v].lower_bound(u));//有重邊的無向圖,刪除(v,u)

            u = v;

        }

else {

            path.push_back(u);

            stk.pop();

            u = stk.top();

            cnt ++;

        }

if

(cnt ==n)break;

    }

while (!stk.empty()) {

        path.push_back(stk.top());

        stk.pop();

    }

for(int i = path.size() -1;i >= 0;i -- )cout << path[i] <<" ";cout <<endl;//倒序輸出!

}

int main()

{

int u,v;

while (scanf("%d%d",&n,&m) != EOF) {

for (int i =0; i <m; i ++) {

scanf("%d%d",&u,&v);

mp[u].push_back(v);

mps[u].insert(v);

//            mp[v].push_back(u);//無向圖

//            mps[v].insert(u);

        }

int s =1;

get_path(s);

    }

return0;

}

//鄰接矩陣法,適合稠密圖

#include <iostream>

#include <cstdio>

#include <cstring>

#include <vector>

#include <stack>

usingnamespacestd;

constint maxn = 100 + 5;

int mp[maxn][maxn];

int deg[maxn];

int in[maxn],out[maxn];//有向圖

vector<int> path;

stack<int> stk;

int n,m;

void get_path(int s)

{

int u = s,v;

int cnt = 0;

stk.push(u);

for(;;)

    {

//if(deg[u]){//無向

if(out[u]){//有向

for (int i = 1; i <= n; i ++) {//設結點從1開始

if(mp[u][i]){

mp[u][i] --;//mp[i][u] --;//通過鄰接矩陣計數可以解決重邊的問題

// deg[u] --;deg[i] --;//無向

out[u] -- ;in[i] --;//有向

                    u = i;

stk.push(u);

break;

                }

            }

        }

else{

path.push_back(stk.top());

stk.pop();

            u = stk.top();

            cnt ++;

        }

if(cnt == n) break;

    }

while (!stk.empty()) {

path.push_back(stk.top());

stk.pop();

    }

for (int i = path.size() - 1; i >= 0; i --) {

printf("%d ",path[i]);

    }printf("\n");

}

int main()

{

int u,v;

while (scanf("%d%d",&n,&m) != EOF) {

memset(mp, 0, sizeof(mp));

// memset(deg, 0, sizeof(deg));

memset(in, 0, sizeof(in));

memset(out, 0, sizeof(out));

for (int i = 0; i < m; i ++) {

scanf("%d%d",&u,&v);

mp[u][v] ++;//mp[v][u] ++;//無向

// deg[u] ++;deg[v] ++;//無向

out[u] ++,in[v] ++;//有向

        }

int s = 1;

get_path(s);

    }

return0;

}