图的深度遍历和回溯

数据结构实验之图论四:迷宫探索

Time Limit: 1000MS 
Memory Limit: 65536KB
Submit 
Statistic 
Discuss

Problem Description

有一个地下迷宫,它的通道都是直的,而通道所有交叉点(包括通道的端点)上都有一盏灯和一个开关;请问如何从某个起点开始在迷宫中点亮所有的灯并回到起点?

Input

连续T组数据输入,每组数据第一行给出三个正整数,分别表示地下迷宫的结点数N(1 < N <= 1000)、边数M(M <= 3000)和起始结点编号S,随后M行对应M条边,每行给出一对正整数,表示一条边相关联的两个顶点的编号。

 

Output

若可以点亮所有结点的灯,则输出从S开始并以S结束的序列,序列中相邻的顶点一定有边,否则只输出部分点亮的灯的结点序列,最后输出0,表示此迷宫不是连通图。
访问顶点时约定以编号小的结点优先的次序访问,点亮所有可以点亮的灯后,以原路返回的方式回到起点。

Example Input

1
6 8 1
1 2
2 3
3 4
4 5
5 6
6 4
3 6
1 5

Example Output

1 2 3 4 5 6 5 4 3 2 1
#include<stdio.h>
#define N 1005
int Pic[N][N];
int Queue[N];
int Check[N];
int rear=0;
void Init(int l){
	int row;
	int col;
	for(int i=0;i<l;i++){
		scanf("%d %d",&row,&col);
		Pic[row-1][col-1]=1;
		Pic[col-1][row-1]=1;
	}
}
void RollBack(int n){
	rear=0;
	for(int i=0;i<n;i++){
		Check[i]=0;
		Queue[i]=0;
		for(int j=0;j<n;j++){
			Pic[i][j]=0;
		}
	}
}
int Deapth(int point,int n){
	Check[point]=1;
	Queue[rear++]=point;
	for(int i=0;i<n;i++){
		if(Pic[point][i]&&!Check[i]){
			Deapth(i,n);
			Queue[rear++]=point;
		}
	}
	return 0;
}
int main(){
	int k,m,n,t;
	scanf("%d",&n);
	while(n--){
		scanf("%d %d %d",&k,&m,&t);
		Init(m);
		Deapth(t-1,k);
		for(int i=0;i<rear;i++){
			i==0?printf("%d",Queue[i]+1):printf(" %d",Queue[i]+1);
		}
		if(rear<2*k-2){
			printf(" 0");
		}
		printf("\n");
		RollBack(k);
	}
	return 0;
}

    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/m0_37848958/article/details/78760736
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞