南邮 OJ 2074 pdf的旅游

pdf的旅游

时间限制(普通/Java) :  1000 MS/ 3000 MS          运行内存限制 : 65536 KByte
总提交 : 157            测试通过 : 41 

比赛描述

a协有一位pdf是一位旅(作)游(死)爱好者,曾经在出去比赛之后拐带学弟翘课一周,四处旅游。

最近pdf又突发奇想,想再出去旅游一次。出去旅游之前当然要好好计划一番。Pdf给自己想去的地方并给它们编好了号(起点为1)。为了不跟自己过不去,pdf提前找出哪些地点存在交通方便的路径,而且只会走这些路径。

为了旅途乐趣的最大化,pdf希望每个地点都到访过的同时,又保证来去都不会走重复的路,而且最终还要回到起点。问想要达到上述要求,pdf应该怎么样安排地点的访问顺序。



输入

第一行一个整数t,表示数据组数。

每组数据的第一行两个整数nm分别表示地点数和路径数。(2≤n≤10,n≤m≤n(n-1)/2)

接下来的m行每行两个整数x表示xy之间交通方便。(保证两点之间只会有一条路)(1x,yn)

输出

每组数据输出一行,从起点开始的游览顺序。以空格分隔开。如果存在多解,则输出字典序最小的路径。(除起点外每个点只能访问一次)


样例输入

2
4 4
1 3
2 3
2 4
1 4

5 7
1 4
1 5
4 2
5 3
3 2
5 4
2 1

样例输出

1 3 2 4 1
1 2 3 5 4 1

题目来源

kojimai




#include<iostream>
#define MAX_N 11
using namespace std;
bool map[MAX_N][MAX_N];
bool visited[MAX_N],findFlag;
char path[MAX_N];
int n,m;


void init(){
	memset(map,0,sizeof(map));
	memset(visited,0,sizeof(visited));		//WA1
	findFlag = 0;
}

void input(){
	int i,x,y;
	for(i=0;i<m;i++){
		scanf("%d%d",&x,&y);
		map[x][y]=map[y][x]=1;
	}
}

//现在位置为 i ,现在尝试currentPath[index]的值
void dfs(int i,int index){
	path[index] = i;
	if(index == n && i==1){
		findFlag = 1;
		return;
	}
	for(int j=1; !findFlag && j<=n; j++){
		if(!visited[j] && map[i][j]){
			visited[j] = 1;
			dfs(j,index+1);
			visited[j] = 0;
		}
	}
}

void handle(){
	path[0] = 1;
	for(int j=2; !findFlag && j<=n; j++){
		if(!visited[j] && map[1][j]){
			visited[j] = 1;
			dfs(j,1);
			visited[j] = 0;
		}
	}
}

void print(){
	if(!findFlag){
		return;
	}
	printf("%d",int(path[0]));
	for(int i=1; i<=n; i++){
		printf(" %d",int(path[i]));
	}
	printf("\n");
}

int main(){
//	freopen("test.txt","r",stdin);
	int t;
	scanf("%d",&t);
	while(t--){
		scanf("%d%d",&n,&m);
		init();
		input();
		handle();
		print();
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值