您的位置:首页 > 其它

欧拉回路模板

2016-03-18 20:01 288 查看
#include<iostream>
#include<stack>
const int MAXN=111;
using namespace std;

stack<int>S;
int edge[MAXN][MAXN];
int n,m;

void dfs(int x){
S.push(x);
for(int i=1;i<=n;i++){
if(edge[x][i]>0){
edge[i][x]=edge[x][i]=0;//删除此边
dfs(i);
break;
}
}
}

//Fleury算法的实现
void Fleury(int x){
S.push(x);
while(!S.empty()){
int b=0;
for(int i=1;i<=n;i++){
if(edge[S.top()][i]>0){
b=1;
break;
}
}
if(b==0){
printf("%d",S.top());
S.pop();
}else {
int y=S.top();
S.pop();
dfs(y);//如果有,就dfs
}
}
printf("\n");
}

int main(){
scanf("%d%d",&n,&m); //读入顶点数以及边数
memset(edge,0,sizeof(edge));
int x,y;
for(int i=1;i<=m;i++){
scanf("%d%d",&x,&y);
edge[x][y]=edge[y][x]=1;
}
//如果存在奇数顶点,则从奇数顶点出发,否则从顶点0出发
int num=0,start=1;
for(int i=1;i<=n;i++){                        //判断是否存在欧拉回路
int degree=0;
for(int j=1;j<=n;j++){
degree+=edge[i][j];
}
if(degree&1){
start=i,num++;
}
}
if(num==0||num==2){
Fleury(start);
}else
printf("No Euler Path\n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: