poj1041 John's trip,无向图求欧拉回路路径

点击打开链接

无向图求欧拉回路:

1、图连通

2、所有顶点的度数位偶数


#include <cstdio>
#include <cstring>
#include <stack>
#include <queue>
#include <algorithm>

using namespace std;
const int mt = 2000;
const int ms = 50;

bool vis[mt+5];
int g[ms][mt+5];
int deg[ms+5];
int	f[ms+5];
stack<int> s;
int street, startv;

int findset(int x){
	return f[x]==x?f[x]:f[x]=findset(f[x]);
}

void Union(int x, int y){
	int fx = findset(x);
	int fy = findset(y);
	if(fx!=fy){
		f[fx] = fy;
	}	
}

bool used[ms];

bool check(){
	for(int i=1,cnt=0; i<=ms; ++i) if(used[i]){
		if(deg[i]&1) return false;
		if(f[i]==i){
			if(cnt++==1) return false;
		}
	}	
	return true;
}

void euler(int u){
	for(int i=1; i<=street; ++i) if(g[u][i]){
		if(!vis[i]){
			vis[i] = 1;
			euler(g[u][i]);
			s.push(i);
		}
	}
}	

//ps:其实给出的图已经连通。。。。
int main()
{
	int x, y, z;
	while(~scanf("%d%d", &x, &y)){
		if(x==0&&y==0) break;
		scanf("%d", &z);
		memset(g, 0, sizeof g );
		for(int i=0; i<=ms; ++i) f[i] = i;
		memset(used, 0, sizeof used );
		memset(deg, 0, sizeof deg );
		street = z;
		startv = min(x, y);
		deg[x]++; deg[y]++;
		g[x][z] = y;
		g[y][z] = x;
		Union(x, y);
		used[x] = used[y] = 1; 
		while(~scanf("%d%d", &x, &y)){
			if(x==0&&y==0) break;
			scanf("%d", &z);
			street = max(z, street);
			deg[x]++; deg[y]++;
			g[x][z] = y;
			g[y][z] = x;
			Union(x, y);
			used[x] = used[y] = 1;
		}
		
		if(!check()){
			puts("Round trip does not exist.");
			continue;
		} else {
			memset(vis, 0, sizeof vis );
			euler(startv);
			while(!s.empty()){
				printf("%d ", s.top());
				s.pop();	
			}
			printf("\n");
		}
	}
	return 0;
}







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值