DFS BFS代码
#define maxnum 30
#include<bits_stdc++.h>
int visited[maxnum]={0};
using namespace std;
typedef struct bian//边
{
int mark;//标记是否搜索
int ivex,jvex;//两顶点位置
bian *ilink,*jlink;//指向两顶点的其他边
int info;//信息
} bian,*pbian;
typedef struct dian//点
{
char name;
bian *first;//指向边
} dain;
typedef struct graph//图
{
dian dj[maxnum];
} graph;
typedef struct//队列
{
int base[maxnum];
int f;//front
int r;//rear
}que;
void initq(que &q)//初始化队列
{
q.f=q.r=0;
}
void enq(que &q,int e)//队尾插入
{
q.base[q.r]=e;
q.r=q.r+1;
}
void deq(que &q,int &e)//队头删除
{
e=q.base[q.f];
q.f=q.f+1;
}
int getlc(graph &g,char c,int n)//将顶点信息转化为位置
{
for(int i=0; i<n; i++)
if(c==g.dj[i].name)
return i;
}
void creatgraph(graph &g,int &n)//图的创建
{
int k,m;
cout<<"请输入图顶点个数:"<<endl;
cin>>n;
cout<<endl<<"请输入顶点信息(名称):"<<endl;
for(k=0; k<n; k++)
{
cin>>g.dj[k].name;
g.dj[k].first=NULL;
}
cout<<endl<<"请输入边个数:"<<endl;
cin>>m;
char a,b;
int mark,i,j;
pbian p1,p2;
cout<<endl<<"请输入边关系:"<<endl;
for(k=0; k<m; k++)
{
cin>>a>>b;
i=getlc(g,a,n);
j=getlc(g,b,n);
p1=(pbian)malloc(sizeof(bian));
p1->ivex=i;
p1->jvex=j;
p1->ilink=NULL;
p1->jlink=NULL;
p2=g.dj[i].first;
if(p2==NULL)
g.dj[i].first=p1;
else
{
mark=0;
while(mark==0)
{
if(p2->ivex==i&&p2->ilink==NULL) mark=1;
else if(p2->jvex==i&&p2->jlink==NULL) mark=2;
else if(p2->ivex==i) p2=p2->ilink;
else p2=p2->jlink;
}
if(mark==1) p2->ilink=p1;
else p2->jlink=p1;
}
p2=g.dj[j].first;
if(p2==NULL)
g.dj[j].first=p1;
else
{
mark=0;
while(mark==0)
{
if(p2->ivex==j&&p2->ilink==NULL) mark=1;
else if(p2->jvex==j&&p2->jlink==NULL) mark=2;
else if(p2->ivex==j) p2=p2->ilink;
else p2=p2->jlink;
}
if(mark==1) p2->ilink=p1;
else p2->jlink=p1;
}
}
}
void disp(graph &g,int n)//显示对应关系
{
cout<<"位置 名称"<<endl;
for(int i=0; i<n; i++)
cout<<i<<" "<<g.dj[i].name<<endl;
}
void visit(graph &g,int v)//visit 函数
{
cout<<g.dj[v].name;
visited[v]=1;
}
void dfs(graph &g,int i)//dfs
{
if(visited[i]==0)
visit(g,i);
bian *p;
p=g.dj[i].first;
if(p==NULL)return ;
else
{
int m=0;
while(m==0)
{
if(p->ivex==i)
{
if(visited[p->jvex]==0)
{
dfs(g,p->jvex);
}
if(p->ilink==NULL)m=1;
else p=p->ilink;
}
else
{
if(visited[p->ivex]==0)
{
dfs(g,p->ivex);
}
if(p->jlink==NULL)m=1;
else p=p->jlink;
}
}//while
}//else
}
void bfs(graph &g)//bfs
{
int i,u;
bian *t;
cout<<"请输入开始遍历的点:"<<endl;
cin>>i;
que q;//队列q
initq(q);
if(visited[i]==0)
{
visit(g,i);
enq(q,i);
}
while(q.f!=q.r)//队不空
{
deq(q,u);
t=g.dj[u].first;
if(t==NULL)return;
int m=0;
while(m==0)
{
if(t->ivex==u)
{
if(visited[t->jvex]==0)
{
visit(g,t->jvex);
enq(q,t->jvex);
}
if(t->ilink==NULL)m=1;
else t=t->ilink;
}
else
{
if(visited[t->ivex]==0)
{
visit(g,t->ivex);
enq(q,t->ivex);
}
if(t->jlink==NULL)m=1;
else t=t->jlink;
}
}//while
}//while
}
void clearr()
{
for(int i=0;i<maxnum;i++)
{
visited[i]=0;
}
}
int main()
{
graph g;
int t=0;
int n;
creatgraph(g,n);
disp(g,n);
while(t!=3)
{
cout<<endl<<"请选择遍历方式(1:DFS,2:BFS,3:QUIT):"<<endl;
cin>>t;
if(t==1)
{
dfs(g,0);
clearr();
}
else if(t==2)
{
bfs(g);
clearr();
}
else if(t==3)
break;
}
return 0;
}
DFS BFS代码的更多相关文章
- ID(dfs+bfs)-hdu-4127-Flood-it!
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4127 题目意思: 给n*n的方格,每个格子有一种颜色(0~5),每次可以选择一种颜色,使得和左上角相 ...
- 牛客小白月赛6C-桃花(DFS/BFS求树的直径)
链接:https://www.nowcoder.com/acm/contest/136/C 来源:牛客网 桃花 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言 ...
- POJ 3083 -- Children of the Candy Corn(DFS+BFS)TLE
POJ 3083 -- Children of the Candy Corn(DFS+BFS) 题意: 给定一个迷宫,S是起点,E是终点,#是墙不可走,.可以走 1)先输出左转优先时,从S到E的步数 ...
- [LeetCode]695. 岛屿的最大面积(DFS/BFS)、200. 岛屿数量(DFS/BFS待做/并差集待做)
695. 岛屿的最大面积 题目 给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合.你可以假设二维矩阵的四个边缘都被 ...
- DFS/BFS+思维 HDOJ 5325 Crazy Bobo
题目传送门 /* 题意:给一个树,节点上有权值,问最多能找出多少个点满足在树上是连通的并且按照权值排序后相邻的点 在树上的路径权值都小于这两个点 DFS/BFS+思维:按照权值的大小,从小的到大的连有 ...
- 【DFS/BFS】NYOJ-58-最少步数(迷宫最短路径问题)
[题目链接:NYOJ-58] 经典的搜索问题,想必这题用广搜的会比较多,所以我首先使的也是广搜,但其实深搜同样也是可以的. 不考虑剪枝的话,两种方法实践消耗相同,但是深搜相比广搜内存低一点. 我想,因 ...
- [LeetCode] 130. Surrounded Regions_Medium tag: DFS/BFS
Given a 2D board containing 'X' and 'O' (the letter O), capture all regions surrounded by 'X'. A reg ...
- HDU 4771 (DFS+BFS)
Problem Description Harry Potter has some precious. For example, his invisible robe, his wand and hi ...
- DFS/BFS视频讲解
视频链接:https://www.bilibili.com/video/av12019553?share_medium=android&share_source=qq&bbid=XZ7 ...
随机推荐
- kafka java API的使用
Kafka包含四种核心的API: 1.Producer API支持应用将数据流发送到Kafka集群的主题 2.Consumer API支持应用从Kafka集群的主题中读取数据流 3.Streams A ...
- 自定义ajax,添加loading效果
自定义ajax /** * @desc 自定义ajax请求,添加等待gif */ var n=0; $.defineAjax=function(obj){ n++; if(!$('#loadingDi ...
- 【wordpress】wordpress初探
接下来,开始wordpress之旅! 访问wordpress文件夹下的index.php 点击现在就开始. 这里要求我们输入数据库名. 所以先去mysql中新建一个wordpress库 create ...
- MySQL事务实现原理
MySQL事务隔离级别的实现原理 知识储备 只有InnoDB支持事务,所以这里说的事务隔离级别是指InnoDB下的事务隔离级别 隔离级别 读未提交:一个事务可以读取到另一个事务未提交的修改.这会带来脏 ...
- SpringMVC的json交互
一.注解说明 1.@RequestBody 作用:@RequestBody注解用于读取http请求的内容(字符串),通过springmvc提供的HttpMessageConverter接口将读到的内 ...
- Map.Entry遍历集合中的元素
Entry是Map中的一个内部累,map.entrySet()可以得到key和value的视图给你一个比较简单的小事例public static void main(String[] args) { ...
- jquery ui dialog弹出窗 清空缓存Cache或强制刷新
我用jquery ui 弹出一个购物车的对话,通过AJAX加载的数据.发现购物车被缓存,一直看到是旧数据.为了刷新购物车更新,我必须去加一个刷新按钮,点击后更新购物车页面.有没有一种方法来自动刷新加载 ...
- spring_boot 配置
配置pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www ...
- 网站SEO优化
网站的优化应该迎合搜索引擎,这样才能得到事半功倍的效果! 一.站内优化 1.做好HTML头标签 标题(title):标题是网页优化中相当有分量,一般网页title主要包含一些关键词.网站名称等.关键词 ...
- Spring_Spring的特点
一.非侵入式编程 Spring框架的API不会再业务逻辑上出现,即业务逻辑是POJO(Plain Ordinary Java Object).由于业务逻辑中没有Spring的API,所以业务逻辑可以从 ...