UVa10054 The Necklace 欧拉回路

如果图G中的一个路径包括每个边恰好一次,则路径称为欧拉路径。
如果一个回路是欧拉路径,则称为欧拉回路。(即起点终点相同的欧拉路)
有欧拉回路的称为欧拉图,有欧拉路径但无欧拉回路的称为半欧拉图。

无向图是欧拉图:当且仅当图的结点度数都为偶数。

// UVa10054 The Necklace
//zhizhao zhuo
#include<iostream> 
#include<cstring>
#include<cstdio>
#include<vector>
#define M(a) memset(a,0,sizeof(a));
using namespace std;
const int maxn= 50+10;
int du[maxn],grid[maxn][maxn];
struct node{
	int u,v;
	node(int u,int v):u(u),v(v){}
};
vector<node>Q;
void found(int u){
	for(int i=1;i<=50;i++)if(grid[u][i]){
		grid[u][i]--;grid[i][u]--;
		found(i);
		Q.push_back(node(u,i));
	}
}
int main(){
	int T,N;
	scanf("%d",&T);
	for(int sum=0;sum<T;sum++){
		M(du);M(grid);
		scanf("%d",&N);
		int u,v,start;
		for(int i=0;i<N;i++){
			scanf("%d%d",&u,&v);
			du[u]++;du[v]++;
			grid[u][v]++;grid[v][u]++;
			start=u;
		}
		if(sum)printf("\n");
		printf("Case #%d\n",sum+1);
		bool mark=true;
		for(int i=1;i<=50;i++)if(du[i]%2!=0){mark=false;break;}
		if(mark){
			Q.clear();
			found(start);
			if(Q.size()!=N || Q[Q.size()-1].u !=Q[0].v)mark=false;
		}
		if(!mark)printf("some beads may be lost\n");
		else for(int i=Q.size()-1;i>=0;i--)printf("%d %d\n",Q[i].u,Q[i].v);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/love_phoebe/article/details/80624708