#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. (转)CentOS7 搭建LVS+keepalived负载均衡(一)

    原文:http://blog.csdn.net/u012852986/article/details/52386306 CentOS7 搭建LVS+keepalived负载均衡(一) CentOS7 ...

  2. 深入理解子元素的width与父元素的width关系

    深入理解父元素与子元素的width关系 对于这一部分内容,如果理解准确,可以更容易控制布局,节省不必要的代码,这里将简单研究. 第一部分:父子元素都是内联元素 代码演示如下: <!DOCTYPE ...

  3. centos 7编译安装apache

    1.安装工具和依赖包 yum install unzipyum -y install gcc gcc-c++ 2.创建软件安装目录mkdir /usr/local/{apr,apr-util,apr- ...

  4. 自定义ajax,添加loading效果

    自定义ajax /** * @desc 自定义ajax请求,添加等待gif */ var n=0; $.defineAjax=function(obj){ n++; if(!$('#loadingDi ...

  5. JQuery JSON Servlet

    <script type="text/javascript" src="js/jquery-1.10.2.js"></script> & ...

  6. [转] 多种方法查看Oracle SQL执行计划

    本文转自:http://falchion.iteye.com/blog/616234 一.在线查看执行计划表 如果PLAN_TABLE表不存在,执行$ORACLE_HOME/rdbms/admin/u ...

  7. git记住提交密码的技巧

    修改.git包里面的config文件,添加 [credential] helper = store

  8. Android-多线程Handler

    http://www.cnblogs.com/plokmju/p/android_Handler.html android不允许在主线程里做耗时操作,如网络操作,以此来避免ANR ANR(Applic ...

  9. 基于Netty的NIO优化实践

    1. 浅谈React模型 2. Netty TCP 3. Netty UTP

  10. Iphone各个型号机型的详细参数,尺寸和dpr以及像素

    1.iPhone尺寸规格 2.单位inch(英吋) 1 inch = 2.54cm = 25.4mm 3.iPhone手机宽高 上表中的宽高(width/height)为手机的物理尺寸,包括显示屏和边 ...