现在的位置: 首页 > 综合 > 正文

POJ 1041 John’s trip (欧拉回路)

2013年08月08日 ⁄ 综合 ⁄ 共 1105字 ⁄ 字号 评论关闭

题意:John买了新车,想开车去拜访他的朋友,已知每条街道上都恰巧有他的一个朋友,所以他想穿过每条街道一次并且回到起点。城镇上街道总数不超过1995,节点总数不超过44,任意一个节点所关联的街道总数不超过44,每一条街道所关联的两个节点都不同,每条街道的编号也不同。起点是第一次输入的两个节点中较小的那个。若存在多条回路,输出字典序最小的。

#include <iostream>
using namespace std;

#define MAXN 2000
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))

struct Edge
{
	int st, ed;
	bool del;
} edge[MAXN];

int stk[MAXN];
int deg[50];
int top, E, V;

void find_path ( int now )
{
	for ( int i = 1; i <= E; i++ )  // 边从小到大取
	{
		if ( ! edge[i].del && (edge[i].st == now || edge[i].ed == now) )
		{
			edge[i].del = true;
			if ( edge[i].st == now )
			    find_path ( edge[i].ed );
			else
				find_path ( edge[i].st );
			stk[++top] = i;
		}
	}
}

int main()
{
	int x, y, z, s;
	while ( 1 )
	{
		scanf("%d%d",&x,&y);
		if ( x == 0 && y == 0 ) break;

		memset(deg,0,sizeof(deg));
		s = min ( x, y );
		E = top = 0;

		scanf("%d",&z);
		edge[z].st = x;
		edge[z].ed = y;
		edge[z].del = false;
		deg[x]++; deg[y]++;
		E = max ( E, z );
		V = max ( V, max(x,y) );

	    while ( 1 )
		{
			scanf("%d%d",&x,&y);
			if ( x == 0 && y == 0 ) break;
			scanf("%d",&z);
			edge[z].st = x;
	        edge[z].ed = y;
	        edge[z].del = false;
			deg[x]++; deg[y]++;
			E = max ( E, z );
			V = max ( V, max(x,y) );
		}

		
		int i;
		for ( i = 1; i <= V; i++ )
			if ( deg[i] % 2 ) break;

		if ( i <= V )
			printf("Round trip does not exist.\n");
		else
		{
			find_path ( s );
			for ( i = top; i >= 1; i-- )
				printf("%d ",stk[i]);
			printf("\n");
		}
	}
	return 0;
}

抱歉!评论已关闭.