数据结构实验之图论四:迷宫探索
来源:互联网 发布:淘宝借贷额度怎么提高 编辑:程序博客网 时间:2024/05/15 11:32
数据结构实验之图论四:迷宫探索
Time Limit: 1000MS Memory limit: 65536K
题目描述
有一个地下迷宫,它的通道都是直的,而通道所有交叉点(包括通道的端点)上都有一盏灯和一个开关;请问如何从某个起点开始在迷宫中点亮所有的灯并回到起点?
输入
连续T组数据输入,每组数据第一行给出三个正整数,分别表示地下迷宫的结点数N(1 < N <= 1000)、边数M(M <= 3000)和起始结点编号S,随后M行对应M条边,每行给出一对正整数,表示一条边相关联的两个顶点的编号。
输出
若可以点亮所有结点的灯,则输出从S开始并以S结束的序列,序列中相邻的顶点一定有边,否则只输出部分点亮的灯的结点序列,最后输出0,表示此迷宫不是连通图。
访问顶点时约定以编号小的结点优先的次序访问,点亮所有可以点亮的灯后,以原路返回的方式回到起点。
示例输入
16 8 11 22 33 44 55 66 43 61 5
示例输出
1 2 3 4 5 6 5 4 3 2 1
#include <stdio.h>#include <stdlib.h>#include <string.h>#include<queue>#define INF = 0x3f3f3f3f#define MAX 100using namespace std;typedef struct arcnode{ int adj;} arcnode, adjmatrix[110][110];typedef struct{ adjmatrix a; int vn; int an;} MG;int create(MG &g, int n, int m){ int i, j; int v1, v2; g.vn = n; g.an = m; for(i=1; i<=g.vn; i++) for(j=1; j<=g.vn; j++) g.a[i][j].adj = 0; for(i=1; i<=g.an; i++) { scanf("%d %d", &v1, &v2); g.a[v1][v2].adj = 1; g.a[v2][v1] = g.a[v1][v2]; } return 1;}int v[110];int b[110];int c;void dfs(MG &g, int i){ int j; //若不在函数内定义则无法回溯 b[c++] = i; v[i] = 1; for(j=1; j<=g.vn; j++) { if(g.a[i][j].adj==1&&!v[j]) { dfs(g, j); b[c++] = i; //注意等于i(原路返回相当于回溯的过程) } }}int main(){ int t; int n, m, k, i, j; MG g; scanf("%d", &t); while(t--) { memset(v, 0, sizeof(v)); memset(b, 0, sizeof(b)); c=0; scanf("%d %d %d", &n, &m, &k); create(g, n, m); dfs(g, k); for(i=0; i<c; i++) { if(i==0) printf("%d", b[i]); else printf(" %d", b[i]); } if((c+1)/2 != n) printf(" 0"); if(t!=0) printf("\n"); }}
#include <stdio.h>#include <stdlib.h>#include <queue>#include <string.h>using namespace std;int a[1010][1010];int v[1010];int b[1010];int n, m;int k;void dfs(int i){ int j; v[i] = 1; b[k++] = i; for(j=1; j<=n; j++) { if(a[i][j]==1&&!v[j]) { dfs(j); b[k++] = i; } }}int main(){ int i, j, t, v2, v1, s; scanf("%d", &t); while(t--) { k = 1; memset(v, 0, sizeof(v)); scanf("%d %d %d", &n, &m, &s); for(i=1; i<=n; i++) for(j=1; j<=n; j++) a[i][j] = 0; while(m--) { scanf("%d %d", &v1, &v2); a[v1][v2] = a[v2][v1] = 1; } dfs(s); for(i=1; i<k; i++) { if(i==1) printf("%d", b[i]); else printf(" %d", b[i]); } if(k/2!=n) printf(" 0"); if(t!=0) printf("\n"); }}
0 0
- 数据结构实验之图论四:迷宫探索
- 数据结构实验之图论四:迷宫探索
- 数据结构实验之图论四:迷宫探索
- SDUTOJ3361-数据结构实验之图论四:迷宫探索
- SDUT3361数据结构实验之图论四:迷宫探索
- 数据结构实验之图论四:迷宫探索
- 数据结构实验之图论四:迷宫探索
- 数据结构实验之图论四:迷宫探索
- 数据结构实验之图论四:迷宫探索
- 数据结构实验之图论四:迷宫探索
- 数据结构实验之图论四:迷宫探索
- 数据结构实验之图论四:迷宫探索
- SDUTACM 数据结构实验之图论四:迷宫探索
- 数据结构实验之图论四:迷宫探索
- 数据结构实验之图论四:迷宫探索
- OJ3361数据结构实验之图论四:迷宫探索
- 数据结构实验之图论四:迷宫探索
- 数据结构实验之图论四:迷宫探索
- linux下静态库和动态库详解
- Android面试宝典
- iOS 设置视图圆角宏
- android webView
- 两个有序链表求差集,合并为一个有序链表
- 数据结构实验之图论四:迷宫探索
- HDU 5695 Gym Class (拓扑排序+优先队列+Vector)
- TCP-自定义浏览器连接到tomcat服务器
- VS2012自动创建类头注释
- 几种网络服务器模型的介绍与比较
- 微信关注事件bug记录
- (KMP算法)HDOJ-----1711Number Sequence
- 有趣算法-堆排序学习整理
- 删除Linux下文件名乱码的文件