歐拉回路--輸出歐拉回路的路徑
//有向or無向均可,重邊
step1:從u開始,找到與他相連的v,放入棧,刪除(u,v)這條邊,然後從v開始
step2:當有一點沒有與他相連的點時,放入path,然後從stack取棧頂繼續開始找點刪邊。
最後記得把棧裡的點放到path中。
path倒序輸出
//需要先找到起點
//鄰接表法,適合稀疏圖
#include <cstdio>
#include <iostream>
#include <vector>
#include <stack>
#include <set>
usingnamespacestd;
const
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.
mps[u].erase(mps[u].begin());
// mps[v].erase(mps[v].find(u));//無重邊的無向圖,要刪除(v,u)
// mps[v].erase(mps[v].lower_bound(u));//有重邊的無向圖,刪除(v,u)
u = v;
}
else {
path.push_back(u);
stk.pop();
u = stk.top();
cnt ++;
}
if
}
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;
}