#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代码的更多相关文章

  1. ID(dfs+bfs)-hdu-4127-Flood-it!

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4127 题目意思: 给n*n的方格,每个格子有一种颜色(0~5),每次可以选择一种颜色,使得和左上角相 ...

  2. 牛客小白月赛6C-桃花(DFS/BFS求树的直径)

    链接:https://www.nowcoder.com/acm/contest/136/C 来源:牛客网 桃花 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言 ...

  3. POJ 3083 -- Children of the Candy Corn(DFS+BFS)TLE

    POJ 3083 -- Children of the Candy Corn(DFS+BFS) 题意: 给定一个迷宫,S是起点,E是终点,#是墙不可走,.可以走 1)先输出左转优先时,从S到E的步数 ...

  4. [LeetCode]695. 岛屿的最大面积(DFS/BFS)、200. 岛屿数量(DFS/BFS待做/并差集待做)

    695. 岛屿的最大面积 题目 给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合.你可以假设二维矩阵的四个边缘都被 ...

  5. DFS/BFS+思维 HDOJ 5325 Crazy Bobo

    题目传送门 /* 题意:给一个树,节点上有权值,问最多能找出多少个点满足在树上是连通的并且按照权值排序后相邻的点 在树上的路径权值都小于这两个点 DFS/BFS+思维:按照权值的大小,从小的到大的连有 ...

  6. 【DFS/BFS】NYOJ-58-最少步数(迷宫最短路径问题)

    [题目链接:NYOJ-58] 经典的搜索问题,想必这题用广搜的会比较多,所以我首先使的也是广搜,但其实深搜同样也是可以的. 不考虑剪枝的话,两种方法实践消耗相同,但是深搜相比广搜内存低一点. 我想,因 ...

  7. [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 ...

  8. HDU 4771 (DFS+BFS)

    Problem Description Harry Potter has some precious. For example, his invisible robe, his wand and hi ...

  9. DFS/BFS视频讲解

    视频链接:https://www.bilibili.com/video/av12019553?share_medium=android&share_source=qq&bbid=XZ7 ...

随机推荐

  1. (转)MySQL性能调优my.cnf详解

    MySQL性能调优my.cnf详解 https://blog.linuxeye.cn/379.html http://blog.csdn.net/orichisonic/article/details ...

  2. UI设计黄金法则

    1. 网页用户界面(WUI - web user interface) 最佳设计经验与准则 以主页为基准,建立标准的层级结构 保持布局的一致性 将大版本的内容或过于复杂的任务分解为多个页面显示 将导航 ...

  3. selenium+Python(Js处理日历控件)

    日历控件是web网站上经常会遇到的一个场景,有些输入框是可以直接输入日期的,有些不能,以我们经常抢票的12306网站为例,详细讲解如何解决日历控件为readonly属性的问题. 基本思路:先用js去掉 ...

  4. 027-MyBatis相关配置模板

    SqlMapConfig.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE confi ...

  5. 深入java虚拟机学习 -- 类的卸载

    类的生命周期 在开始本节之前让我们再来回顾下类的生命周期 没看过前6个过程的同学建议从头看下<深入java虚拟机学习 -- 类的加载机制>,这里就不再过多介绍了,着重说下类的卸载 类的卸载 ...

  6. document.frames与window.frames在不同浏览器中的使用

    问题: document.frames 只有 IE Opera 支持.等同于 window.frames.用来取得当前页面内 window 对象的集合. 在 Firefox Chorome Safar ...

  7. Visual Studio中修改项目的输出目录

    1. 如在Solution中的项目名称为 ProjectA 但在本地目录显示却想换成: MyProject 2. 应该做的修改是: 2.1. 将本地目录的 ProjectA手动修改成 MyProjec ...

  8. python风味之list创建

    单重for循环 >>> [x * x for x in xrange(10)] [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] 单重for循环+if条件 & ...

  9. spring web.xml基本配置

    <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmln ...

  10. js 判断id 是否存在

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...