#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. [原]SuperMap GIS(JavaScript) 拉框放大和缩小功能实现

    版权声明:本文为博主原创文章,未经博主允许不得转载. var ZoomControl; /* * 拉框缩小 */ function ZoomOut(){ if(ZoomControl==null||Z ...

  2. Django查询一个权限中包含哪些用户

    Django查询一个权限中包含哪些用户 Django的Permission对象中没有直接查询相关用户的信息,而都是通过User对象来查询某个用户有哪些权限,例如: user.objects.get(u ...

  3. jquery jgrid filterToolBar beforeSearch 修改postData

    beforeSearch: function() { var posted_data = $("#mygrid").jqGrid('getGridParam,'postData') ...

  4. extern、 const、static的理解

    1.extern:是一个声明,用来告诉编译器其它文件中存在这个变量,可以拿到使用.是文件级的 2.static:   是一个文件内的声明,只能在本文件内使用,是文件中的(函数级的) 3.const   ...

  5. html中行级元素的居中显示。

    垂直居中.以label标签为例. <style> #label1{ vertical-align:middle; line-height:40px;<*父元素的height*> ...

  6. CSS基础知识---浮动,定位和盒模型

    转载请注明出处! 需要掌握的三个最重要的CSS概念是浮动,定位和盒模型. 盒模型概述: 页面上的每个元素都被看做一个矩形框(元素框or盒模型),这个框由元素内容,内边距,边框和外边距组成. 内边距出现 ...

  7. mybatis动态参数(使用PreparedStatement插入#)和静态参数($)

    1.使用#传递参数 #{}:被JDBC解析为PreparedStatement预编译语句,变量内容被当做一个整体变量,比如字符串,整形等. 2.使用$传递参数 ${}:纯粹是字符串替换,中间可以出现S ...

  8. 修改django 后台admin用户的密码

    python manage.py shellfrom django.contrib.auth.models import User from django.contrib.auth.models im ...

  9. IntelliJ IDEA 快捷键(二)(window版)

    一.重构 1.重构变量 修改变量名称,即重命名.快捷键 Shift + F6 ,位于 Refactor 中. 2.重构方法 可以增加变量个数.快捷键 Ctrl + F6 ,位于 Refactor 中. ...

  10. 二、redis的配置

    # redis 配置文件示例 # 当你需要为某个配置项指定内存大小的时候,必须要带上单位, # 通常的格式就是 1k 5gb 4m 等酱紫: # # 1k => 1000 bytes # 1kb ...