问题 K: 数据结构(C语言版)算法7.4至算法7.6__DFS与BFS //这题做法不正规
2016-06-23 23:38
211 查看
前言必读!http://blog.csdn.net/hnust_v/article/details/51747743
问题 K: 数据结构(C语言版)算法7.4至算法7.6__DFS与BFS
时间限制: 1 Sec 内存限制: 128 MB
本来是想认真写一编链式的,但是,实力不够驾驭不足啊(上课不听,课后不学-_-!)
问题 K: 数据结构(C语言版)算法7.4至算法7.6__DFS与BFS
时间限制: 1 Sec 内存限制: 128 MB
题目描述 求图的DFS序列及BFS序列。图的顶点数<=20,边数<=100。 输入 图用邻接表存储。 图中的顶点用一个结构体数组存储,结构体定义如下: typedef struct tnode { int vexdata; struct node *firstarc; }TD; 图中各顶点后接一个单链表,存储与顶点连接有边的邻接顶点信息,邻接顶点信息用结构体存储,定义如下: typedef struct node { int adjvex; struct node *next; }JD; 程序运行时,先输入图的顶点个数及边的条数。注意,对于无向图而言,2顶点间的边算2条边。 然后输入顶点数据。 然后输入各条边信息,包括边的起点的值,终点的值(并不是点的序号)。 说明:为保证答案的唯一性,要求邻接表在建立各顶点后的单链表时,用头插法插入新来的结点。 输出 (这里是输出点的序号,序号是从1开始的)。 第一行输出DFS序列,序列中数字用逗号隔开。 第二行输出BFS序列,序列中数字用逗号隔开。 样例输入 8,18 11 22 33 44 55 66 77 99 11,22 22,11 11,33 33,11 22,44 44,22 22,55 55,22 44,99 99,44 55,99 99,55 33,66 66,33 33,77 77,33 66,77 77,66 样例输出 1,3,7,6,2,5,8,4 1,3,2,7,6,5,4,8 提示
本来是想认真写一编链式的,但是,实力不够驾驭不足啊(上课不听,课后不学-_-!)
//具体分析待补 #include <bits/stdc++.h> using namespace std; typedef struct { int data; int vexCount; int V[101]; bool visit; }P; P Point[40]; bool Judge_first; void DFS(int n,int i) { if(Point[i].visit) return;///该节点已被访问结束DFS if(!Judge_first) printf(","); else Judge_first=false; printf("%d",i);Point[i].visit=true; for(int k=Point[i].vexCount;k>=1;k--) DFS(n,Point[i].V[k]); } void Handle(int n,int m) { map<int,int> Map;map<int,int>::iterator it; for(int i=1,a;i<=n&&scanf("%d",&a);i++) { Map[a]=i; //!建立节点信息查询表 Point[i].data=i; Point[i].vexCount=0; Point[i].visit=false; } for(int i=1,A,B,a,b,Count;i<=m;i++) //! A->B a->b { scanf("%d%*c%d",&A,&B); it=Map.find(A);a=(*it).second; it=Map.find(B);b=(*it).second; Count=++Point[a].vexCount; Point[a].V[Count]=b; Count=++Point[b].vexCount; Point[b].V[Count]=a; //! 建立无向图 } DFS(n,1);putchar('\n'); for(int i=1;i<=n;i++) Point[i].visit=false; ///BFS queue<int> Que; Que.push(1);Point[1].visit=true; Judge_first=true; while(!Que.empty()) { int i=Que.front();Que.pop(); if(!Judge_first) printf(","); else Judge_first=false; printf("%d",i); for(int k=Point[i].vexCount;k>=1;k--) if(!Point[Point[i].V[k]].visit) {Point[Point[i].V[k]].visit=true;Que.push(Point[i].V[k]);} } putchar('\n'); } int main(void) { //freopen("f:\\test.txt","r",stdin); int n,m; while(~scanf("%d%*c%d",&n,&m)) { Judge_first=true; Handle(n,m); } }
相关文章推荐
- 《java数据结构与算法》笔记-CH4-8栈结构实现后缀表达式计算结果
- 《Java数据结构与算法》笔记-CH4-6栈结构实现中缀转后缀
- 数据结构与算法分析 学习笔记(一)
- OpenCV(2)-Mat数据结构及访问Mat中像素
- 二叉树之统计叶子数
- 数据结构(左偏树):HDU 1512 Monkey King
- 《算法竞赛入门经典》第一章 程序设计入门 习题
- 数据结构实验之链表九:双向链表
- 数据结构实验之链表七:单链表中重复元素的删除
- MySQL索引背后的数据结构及算法原理
- 数据结构之树的基本操作
- 以栈解决迷宫问题
- 栈、队列、背包的数组与链表实现
- java 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。
- 文件-第12章-《数据结构题集》习题解析-严蔚敏吴伟民版
- 12-1-顺序文件归并-文件-第12章-《数据结构》课本源码-严蔚敏吴伟民版
- php SPL四种常用的数据结构
- 外部排序-第11章-《数据结构题集》习题解析-严蔚敏吴伟民版
- 数据结构c语言描述(美)习题1-3 n个布尔变量的真值组合
- 数据结构和算法 – 12.高级查找算法(上)