首页 > 代码库 > SDUT 3361 数据结构实验之图论四:迷宫探索

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

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

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

DQE:

本题题意一开始不太明确,参考了一下已AC的代码,意思是走的过程中遇到死路返回上一级,在走下一个可行节点,直到完成第一次深度优先搜索,判断计数变量和定点数是否相等,从而判定是否为连通图,非连通图和连通图输出序列一个套路,只是最后多个0。
需要注意的是多组数据,计数变量需要再每次开始深搜之前初始化为0,不可以用static定义在DFS函数里(这样只能初始化一次,笔者一开始犯的就是这个错误)。
 
 1 #include <iostream>
 2 #include <cstdio>
 3 
 4 using namespace std;
 5 
 6 #define MVN 1010    /*本地运行时改为100左右才可以,不然运行时错误,提交时改为1000+可AC*/
 7 
 8 typedef struct AdjMatrix
 9 {
10     int w;
11     char *info;
12 }AM;
13 
14 typedef struct MGraph
15 {
16     int vex[MVN];
17     AM arc[MVN][MVN];
18     int vexnum,arcnum;
19     int k;
20 }MG;
21 
22 void creat(MG &G)
23 {
24     int i,j,k;
25     for(k=1;k<=G.vexnum;k++)
26     {
27         G.vex[k]=k;
28     }
29     for(k=1;k<=G.arcnum;k++)
30     {
31         scanf("%d %d",&i,&j);
32         G.arc[i][j].w=1;
33         G.arc[j][i].w=1;
34     }
35 }
36 
37 int count=0;    //计数变量
38 int DFS(MG &G,bool *visited,int i)
39 {
40     count++;
41     visited[i]=true;
42     if(G.vex[i]==G.k)
43         printf("%d",G.k);
44     else
45         printf(" %d",G.vex[i]);
46     int k;
47     for(k=1;k<=G.vexnum;k++)
48     {
49         if(G.arc[i][k].w>0&&visited[k]==false)
50         {
51             DFS(G,visited,k);
52             printf(" %d",G.vex[i]);
53         }
54     }
55     return count;
56 }
57 
58 int main()
59 {
60     int t;
61     scanf("%d",&t);
62     while(t--)
63     {
64         MG G={0};
65         scanf("%d %d %d",&G.vexnum,&G.arcnum,&G.k);
66         creat(G);
67         int k;
68         for(k=1;k<=G.vexnum;k++)
69         {
70             if(G.vex[k]==G.k)
71                 break;
72         }
73         bool visited[MVN]={false};
74         count=0;
75         if(DFS(G,visited,k)!=G.vexnum)
76             printf(" 0\n");
77         else
78             printf("\n");
79     }
80     return 0;
81 }
82 
83 /***************************************************
84 User name: ***
85 Result: Accepted
86 Take time: 12ms
87 Take Memory: 1784KB
88 Submit time: 2016-11-08 21:57:57
89 ****************************************************/

 

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