数据结构作业——图的存储及遍历(邻接矩阵、邻接表+DFS递归、非递归+BFS)
邻接矩阵存图
/*
* @Author: WZY
* @School: HPU
* @Date: 2018-11-02 18:35:27
* @Last Modified by: WZY
* @Last Modified time: 2018-11-02 19:48:06
*/
#include <bits/stdc++.h>
#define INF 0x7f7f7f7f
#define ms(a,b) memset(a,b,sizeof(a))
const int maxn=1e3+10;
using namespace std;
int edge[maxn][maxn];
int vis[maxn];
int DFS[maxn];
int n,m;
inline void add(int x,int y)
{
edge[x][y]=1;
}
// 递归DFS
void dfs1(int v,int flag)
{
if(v>n)
return ;
if(flag)
cout<<"->";
cout<<v;
vis[v]=1;
flag++;
for(int i=1;i<=n;i++)
if((!vis[i])&&edge[v][i])
dfs1(i,flag);
}
// 非递归DFS
void dfs2(int v,int flag)
{
ms(vis,0);
ms(DFS,0);
int top=1;
DFS[top]=v;
while(top)
{
int res=DFS[top];
if(!vis[res])
{
vis[res]=1;
if(flag)
cout<<"->";
flag++;
cout<<res;
for(int i=n;i>=1;i--)
if((!vis[i])&&edge[res][i])
DFS[++top]=i;
}
else
top--;
}
cout<<endl;
}
// 查找v的第一个邻接点
int Find_first(int v)
{
for(int i=1;i<=n;i++)
if(edge[v][i])
return i;
return 0;
}
// 查找v的相对于u的下一个邻接点
int Fint_next(int v,int u)
{
int i;
int _=0;
for(i=1;i<=n;i++)
{
if(edge[v][i]&&i==u)
_=1;
else if(_==1&&edge[v][i])
break;
}
if(i>n)
return 0;
return i;
}
// 非递归
void bfs(int v)
{
queue<int>q;
cout<<v;
vis[v]=1;
q.push(v);
while(!q.empty())
{
int res=q.front();
q.pop();
int u=Find_first(res);
while(u)
{
if(!vis[u])
{
cout<<"->"<<u;
vis[u]=1;
q.push(u);
}
u=Fint_next(res,u);
}
}
cout<<endl;
}
inline void print()
{
cout<<"建图完成,请输入遍历开始的起点:";
int v;
cin>>v;
cout<<"请选择需要的遍历方式(输入0停止):"<<endl;
cout<<"1.DFS递归遍历\n2.DFS非递归遍历\n3.BFS非递归遍历"<<endl;
int __;
while(cin>>__&&__)
{
ms(vis,0);
if(__==1)
{
dfs1(v,0);
cout<<endl;
}
if(__==2)
dfs2(v,0);
if(__==3)
bfs(v);
}
}
int main(int argc, char const *argv[])
{
cout<<"请选择:\n1.有向图\n2.无向图"<<endl;
int _;
cin>>_;
if(_==1)
{
cout<<"请输入点的个数及边的个数(用空格隔开):";
cin>>n>>m;
int x,y;//两条边+权值
// 有向图
for(int i=0;i<m;i++)
{
cin>>x>>y;
add(x,y);
}
print();
}
else
{
cout<<"请输入点的个数及边的个数(用空格隔开):";
cin>>n>>m;
int x,y;//两条边+权值
// 无向图
for(int i=0;i<m;i++)
{
cin>>x>>y;
add(x,y);
add(y,x);
}
print();
}
return 0;
}
邻接表存图
/*
* @Author: WZY
* @School: HPU
* @Date: 2018-11-02 18:22:38
* @Last Modified by: WZY
* @Last Modified time: 2018-11-02 19:35:07
*/
#include <bits/stdc++.h>
#define INF 0x7f7f7f7f
#define ms(a,b) memset(a,b,sizeof(a))
const int maxn=1e3+10;
using namespace std;
int n,m;
int DFS[maxn];
typedef struct Node
{
int data;
Node* Next;
}Edge;
Edge* Node[maxn];
Edge *s;
int vis[maxn];
// 递归
// 查找v的第一个邻接点
int Find_first(int v)
{
if(Node[v]!=NULL)
return Node[v]->data;
return 0;
}
// 查找v的相对于u的下一个邻接点
int Find_next(int v,int u)
{
Edge *p=Node[v];
while(p!=NULL)
{
if(p->data==u)
break;
p=p->Next;
}
if(p==NULL)
return 0;
p=p->Next;
if(p!=NULL)
return p->data;
return 0;
}
void dfs1(int v,int flag)
{
if(v>n)
return ;
if(flag)
cout<<"->";
cout<<v;
vis[v]=1;
flag++;
int res=Find_first(v);
while(res)
{
if(!vis[res])
dfs1(res,flag);
res=Find_next(v,res);
}
}
// 非递归
void dfs2(int v,int flag)
{
int temp,w;
stack<int>s;
cout<<v;
vis[v]=1;
vis[0]=1;
s.push(v);
while(!s.empty())
{
temp=s.top();
w=Find_first(temp);
if(!vis[w])
{
cout<<"->"<<w;
vis[w]=1;
s.push(w);
}
else
{
w=Find_next(temp,w);
while(w)
{
if(!vis[w])
{
cout<<"->"<<w;
vis[w]=1;
s.push(w);
break;
}
else
w=Find_next(temp,w);
}
if(w==0)
s.pop();
}
}
cout<<endl;
}
void bfs(int v)
{
queue<int>q;
vis[v]=1;
cout<<v;
q.push(v);
while(!q.empty())
{
int res=q.front();
q.pop();
int u=Find_first(res);
while(u)
{
if(!vis[u])
{
cout<<"->"<<u;
vis[u]=1;
q.push(u);
}
u=Find_next(res,u);
}
}
cout<<endl;
}
inline void print()
{
cout<<"建图完成,请输入遍历开始的起点:";
int v;
cin>>v;
cout<<"请选择需要的遍历方式(输入0停止):"<<endl;
cout<<"1.DFS递归遍历\n2.DFS非递归遍历\n3.BFS非递归遍历"<<endl;
int __;
while(cin>>__&&__)
{
ms(vis,0);
if(__==1)
{
dfs1(v,0);
cout<<endl;
}
if(__==2)
dfs2(v,0);
if(__==3)
bfs(v);
}
}
inline void add(int x,int y)
{
s=(Edge*)malloc(sizeof(Edge));
s->data=y;
s->Next=Node[x];
Node[x]=s;
}
inline void init()
{
for(int i=1;i<maxn;i++)
Node[i]=NULL;
}
int main(int argc, char const *argv[])
{
init();
cout<<"请选择:\n1.有向图\n2.无向图"<<endl;
int _;
cin>>_;
if(_==1)
{
cout<<"请输入点的个数及边的个数(用空格隔开):";
cin>>n>>m;
int x,y;//两条边+权值
// 有向图
for(int i=0;i<m;i++)
{
cin>>x>>y;
add(x,y);
}
print();
}
else
{
cout<<"请输入点的个数及边的个数(用空格隔开):";
cin>>n>>m;
int x,y;//两条边+权值
// 无向图
for(int i=0;i<m;i++)
{
cin>>x>>y;
add(x,y);
add(y,x);
}
print();
}
return 0;
}
数据结构作业——图的存储及遍历(邻接矩阵、邻接表+DFS递归、非递归+BFS)的更多相关文章
- 第6章 图的学习总结(邻接矩阵&邻接表)
我觉得图这一章的学习内容更有难度,其实图可以说是树结构更为普通的表现形式,它的每个元素都可以与多个元素之间相关联,所以结构比树更复杂,然而越复杂的数据结构在现实中用途就越大了,功能与用途密切联系,所以 ...
- 图的全部实现(邻接矩阵 邻接表 BFS DFS 最小生成树 最短路径等)
1 /** 2 * C: Dijkstra算法获取最短路径(邻接矩阵) 3 * 6 */ 7 8 #include <stdio.h> 9 #include <stdlib.h> ...
- 图的存储及遍历 深度遍历和广度遍历 C++代码实现
/*图的存储及遍历*/ #include<iostream> using namespace std; //----------------------------------- //邻接 ...
- 二叉树——遍历篇(递归/非递归,C++)
二叉树--遍历篇 二叉树很多算法题都与其遍历相关,笔者经过大量学习.思考,整理总结写下二叉树的遍历篇,涵盖递归和非递归实现. 1.二叉树数据结构及访问函数 #include <stdio.h&g ...
- 二叉树的递归,非递归遍历(C++)
二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的.对于二叉树,有前序.中序以及后序三种遍历方法.因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易 ...
- 【数据结构】——搜索二叉树的插入,查找和删除(递归&非递归)
一.搜索二叉树的插入,查找,删除 简单说说搜索二叉树概念: 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 若它的右 ...
- 数据结构学习笔记05图 (邻接矩阵 邻接表-->BFS DFS、最短路径)
数据结构之图 图(Graph) 包含 一组顶点:通常用V (Vertex) 表示顶点集合 一组边:通常用E (Edge) 表示边的集合 边是顶点对:(v, w) ∈E ,其中v, w ∈ V 有向边& ...
- 【PHP数据结构】图的存储结构
图的概念介绍得差不多了,大家可以消化消化再继续学习后面的内容.如果没有什么问题的话,我们就继续学习接下来的内容.当然,这还不是最麻烦的地方,因为今天我们只是介绍图的存储结构而已. 图的顺序存储结构:邻 ...
- 图的存储结构:邻接矩阵(邻接表)&链式前向星
[概念]疏松图&稠密图: 疏松图指,点连接的边不多的图,反之(点连接的边多)则为稠密图. Tips:邻接矩阵与邻接表相比,疏松图多用邻接表,稠密图多用邻接矩阵. 邻接矩阵: 开一个二维数组gr ...
随机推荐
- 原 spring-boot工程中,jpa下hibernate的ddl-auto的各种属性
jpa: hibernate: ddl-auto: create ddl-auto:create----每次运行该程序,没有表格会新建表格,表内有数据会清空 ddl-auto:create-d ...
- C/C++ 运算符优先级(转载)
最讨厌这个了.在这里记录下. 优先级 操作符 描述 例子 结合性 1 ()[]->.::++-- 调节优先级的括号操作符数组下标访问操作符通过指向对象的指针访问成员的操作符通过对象本身访问成员的 ...
- vue项目如何打包前后端不分离发布手把手教学apache、nginx
vue项目如何不分离发布 1.首先yarn build 我用了vue-cli脚手架,bulid后的dist文件夹里的index.html有加版本号,那么为什么需要加版本号呢? a.回滚 b.解决浏览器 ...
- LY.JAVA面向对象编程.工具类中使用静态、说明书的制作过程、API文档的使用过程
2018-07-08 获取数组中的最大值 某个数字在数组中第一次出现时的索引 制作说明书的过程 对工具类的使用 获取数组中的最大值 获取数字在数组中第一次出现的索引值 API的使用过程 Math
- 总结5条对学习Linux系统有帮助的经验心得
作为国产手机中的代表厂商,OPPO一直走在国内的前沿.不仅手机出货量在国内遥遥领先,而且在国外也抢占不少的市场份额.前段时间,OPPO在台湾地区签下田馥甄和林宥嘉担任OPPO R9s的代言人外,在东南 ...
- IDE 版本
BDS 5 2007 D11 VER180 and VER185 RAD Studio 8 XE D15 VER 220 RAD 18 XE 10.1 Berlin D24 VER310 St ...
- docker 部署 flask(三)高级编写及生成镜像,安装requirements.txt
简介: 上一篇,我写了如何使用别人的docker基础镜像,生成我们的docker镜像. 也就最基本的flask,没有别的库(包)支持.连数据库支持都没有. 也就让大家了解一下怎么生成镜像而已. 本篇介 ...
- mybatis 无法自动补全,没有获得dtd文件
由于网络原因,eclipse无法下载到http://mybatis.org/dtd/mybatis-3-mapper.dtd,导致eclipse的编辑器无法自动补全标签. 解决办法:将dtd文件下载到 ...
- java8新特性Lambda练习
练习内容: 1.实现案例 /** *使用lambda表达式定义Collections.sort() */ /** *使用lambda表达式自定义比对方式 */ @Test public void Te ...
- mybatis column 和property
mybatis map文件中 resultMap中column和sql查询结果对应, property和实体private对应 <resultMap id="VideoYcAppRes ...