Fleury演算法-輸出尤拉回路
佛洛萊演算法輸出尤拉回路。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <set>
#include <iomanip>
#include <algorithm>
#define maxn 10010
#define INF 0xfffffff
using namespace std;
struct Stack
{
int top,node[maxn];
}s;
int edge[maxn][maxn];//鄰接矩陣
int n;//頂點個數
void dfs(int x)
{
int i;
++s.top;
s.node[s.top]=x;
for(i=0;i<n;++i)
if(edge[i][x]>0)
{
edge[i][x]=0;//刪除該邊
edge[x][i]=0;
dfs(i);
break;
}
}
void Fleury(int x)
{
int i,b;
s.top=0;//入棧
s.node[s.top]=x;
while(s.top>=0)
{
b=0;
for(i=0;i<n;++i)
if(edge[s.node[s.top]][i]>0)
{
b=1;
break;
}
if(b==0)//如果沒有點可以擴充套件,輸出並出棧
{
cout<<s.node[s.top]+1<<" ";
--s.top;
}
else
{
--s.top;
dfs(s.node[s.top+1]);//如果有點可以擴充套件
}
}
cout<<endl;
}
int main()
{
int i,j;
int m,s,t;//邊數、讀入邊的起點終點
int degree,num,start;//每個頂點的度、奇度頂點個數、尤拉回路的起點
cin>>n>>m;
memset(edge,0,sizeof(edge));
for(i=0;i<m;++i)
{
cin>>s>>t;
edge[s-1][t-1]=1;edge[t-1][s-1]=1;
}
//如果存在奇度頂點,則從奇度頂點出發,否則從頂點0出發
num=0;start=0;
for(i=0;i<n;++i)//判斷是否存在尤拉回路
{
degree=0;
for(j=0;j<n;++j)
degree+=edge[i][j];
if(degree%2==1)
{
start=i;++num;
}
}
if(num==0||num==2) Fleury(start);
else cout<<"No Euler path"<<endl;
return 0;
}
/*
9 14
1 2
1 8
2 3
2 8
2 9
3 4
4 5
4 6
4 9
5 6
6 7
6 9
7 8
8 9
*/
相關文章
- 尤拉回路
- 圖論—尤拉回路/路徑圖論
- 計蒜客:農場看守(DFS、尤拉回路)
- CF1994F Stardew Valley(尤拉回路)
- 演算法競賽中的常用輸入輸出總結演算法
- 演算法學習之路|PlayOnWords(尤拉道路+dfs)演算法
- [藍橋杯][演算法提高VIP]尤拉函式演算法函式
- 2020-2021 ICPC NERC (NEERC), North-Western Russia Regional Contest (Northern Subregionals) E(離散化+尤拉回路)
- 輸入輸出
- 演算法題---五個執行緒排序輸出演算法執行緒排序
- 尤拉篩
- 尤拉定理
- 尤拉方程
- 輸入輸出流
- 輸出
- 尤拉計劃433題:歐幾里德演算法的步數演算法
- 【C++】輸入輸出C++
- Java 輸入輸出流Java
- 輸入輸出系統
- JAVA輸入輸出流Java
- 尤拉函式φ函式
- 尤拉路徑
- ncurses輸出函式:字元+字串的輸出函式字元字串
- c語言:輸入任意10個正整數,按照升序排序輸出:(冒泡演算法)C語言排序演算法
- PHPexit()輸出PHP
- linux中的輸入與輸出管理(重定向輸入,輸出,管道符)Linux
- C++中的檔案輸入/輸出(3):掌握輸入/輸出流 (轉)C++
- 關於Linux bash shell 輸入、輸出和錯誤輸出Linux
- 資料的輸入輸出
- Java —— 標準輸入輸出Java
- 排序,檔案輸入輸出排序
- 03 資料輸入-輸出
- Python 輸入和輸出Python
- Python的輸入輸出Python
- 檔案操作-輸入輸出
- C語言輸入輸出C語言
- Java基礎輸入輸出Java
- 常用輸入輸出函式函式