定义结点

struct MGraph
{
int vexs[MAXVEX]; //顶点数组
int arc[MAXVEX][MAXVEX]; //邻接矩阵
int numVertex, numEdges; //定点数 边数
};

深度优先遍历

图示

参考代码

bool visited[MAX];
void DFS(MGraph G, int i)
{
cout << G.vexs[i] << " ";
   visited[i] = true;
for (int j = ; j < G.numVertex; ++j)
{
if (G.arc[i][j] == && !visited[j])
DFS(G, j);
}
}
void DFSTranverse(MGraph G)
{
for (int i = ; i < G.numVertex; ++i)
visited[i] = false;
for (int i = ; i < G.numVertex; ++i) //如果是连通图,只执行一次
{
if (!visited[i])
DFS(G, i);
}
}

广度优先遍历

图示

参考代码

void BFSTranverse(MGraph G)
{
queue<int> q;
bool visited[G.numVertex];
for (int i = ; i < G.numVertex; ++i)
visited[i] = false;
for (int i = ; i < G.numVertex; ++i)
{
if (!visited[i])
{
cout << G.vexs[i] << " ";
q.push(i);
visited[i] = true;
while (!q.empty())
{
int k = q.top();
q.pop();
for (int j = ; j < G.numVertex; ++j)
{
if (G.arc[i][j] == && !visitied(j))
{
cout << G.vexs[j] << " ";
visited[j] = true;
q.push(j);
}
}
}
}
   }//for
}

另一种:

void BFS()
{
visited[] = ;
queue q;
q.push();
while(!q.empty())
{
int top = q.front();
cout << top<<" ";//输出
q.pop();
int i ;
for(i = ; i <= M; ++i)
{
if(visited[i] == && matrix[top - ][i - ] == )
{
visited[i] = ;
q.push(i);
}
}
}
}

/******************* 2015.07.06 update ************************/

BFS:

#include <stdio.h>

int o[][] = { { ,  }, { ,  }, { -,  }, { , - } };
int map[][] = { }; int queue[][] = {};
int front = ;
int back = ;
int parent[][][] = {}; void BFS(int sY, int sX, int eY, int eX)
{
queue[back][] = sY;
queue[back++][] = sX;
map[sY][sX] = ;
while (front < back)
{
int Y = queue[front][];
int X = queue[front][];
for (int i = ; i < ; i++)
{
int newY = Y + o[i][];
int newX = X + o[i][];
if (map[newY][newX] == )continue;
if (map[newY][newX] > (map[Y][X] + ))
{
map[newY][newX] = map[Y][X] + ;
parent[newY][newX][] = Y;
parent[newY][newX][] = X;
if ((newY == eY) && (newX == eX))
{
return;
}
queue[back][] = newY;
queue[back++][] = newX;
}
} front++;
}
} int main(int argc, char** argv)
{
freopen("input.txt", "r", stdin);
int N;
scanf("%d\n", &N);
for (int case_num = ; case_num < N; case_num++)
{
for (int i = ; i <= ; i++)
{
for (int j = ; j <= ; j++)
{
scanf("%d\n", &map[i][j]);
if (map[i][j] == )map[i][j] = ;
}
scanf("\n");
}
} BFS(, , , );
if (map[][] == )printf("failed\n");
else printf("%d\n", map[][]); int x = , y = ;
int stack[][] = {};
int step = ;
while (x > || y > )
{
stack[step][] = y;
stack[step++][] = x;
int newY = parent[y][x][];
int newX = parent[y][x][];
x = newX;
y = newY;
} for (int i = step - ; i >= ; i--)
{
printf("%d %d\n", stack[i][], stack[i][]);
}
}

DFS:

#include <stdio.h>

int o[][] = { { ,  }, { ,  }, { -,  }, { , - } };
int map[][] = {};
int minStep = ;
int stack[][] = {};
int step = ;
int minStack[][] = {}; void DFS(int sY, int sX, int eY, int eX)
{
if (step >= minStep)return;
if (map[sY][sX] == )return;
stack[step][] = sY;
stack[step++][] = sX;
map[sY][sX] = ;
if ((sY == eY) && (sX == eX))
{
if (minStep > step)
{
minStep = step;
for (int i = ; i < step; i++)
{
minStack[i][] = stack[i][];
minStack[i][] = stack[i][];
}
}
map[sY][sX] = ;
step--;
return;
}
for (int i = ; i < ; i++)
{
(DFS(sY + o[i][], sX + o[i][], eY, eX));
} map[sY][sX] = ;
step--;
return;
} int main(int argc, char** argv)
{
freopen("input.txt", "r", stdin);
int N;
scanf("%d\n", &N);
for (int case_num = ; case_num < N; case_num++)
{
for (int i = ; i <= ; i++)
{
for (int j = ; j <= ; j++)
{
scanf("%d\n", &map[i][j]);
}
scanf("\n");
}
} DFS(,,,);
printf("%d\n", minStep-);
for (int i = ; i < minStep; i++)
{
printf("%d %d\n", minStack[i][], minStack[i][]);
}
//if (ret)printf("success\n");
//else printf("failed\n");
}

input:


Algorithm --> DFS和BFS的更多相关文章

  1. Clone Graph leetcode java(DFS and BFS 基础)

    题目: Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors. ...

  2. 判断图连通的三种方法——dfs,bfs,并查集

    Description 如果无向图G每对顶点v和w都有从v到w的路径,那么称无向图G是连通的.现在给定一张无向图,判断它是否是连通的. Input 第一行有2个整数n和m(0 < n,m < ...

  3. 数据结构(12) -- 图的邻接矩阵的DFS和BFS

    //////////////////////////////////////////////////////// //图的邻接矩阵的DFS和BFS ////////////////////////// ...

  4. 数据结构(11) -- 邻接表存储图的DFS和BFS

    /////////////////////////////////////////////////////////////// //图的邻接表表示法以及DFS和BFS //////////////// ...

  5. 在DFS和BFS中一般情况可以不用vis[][]数组标记

    开始学dfs 与bfs 时一直喜欢用vis[][]来标记有没有访问过, 现在我觉得没有必要用vis[][]标记了 看代码 用'#'表示墙,'.'表示道路 if(所有情况都满足){ map[i][j]= ...

  6. 图论中DFS与BFS的区别、用法、详解…

    DFS与BFS的区别.用法.详解? 写在最前的三点: 1.所谓图的遍历就是按照某种次序访问图的每一顶点一次仅且一次. 2.实现bfs和dfs都需要解决的一个问题就是如何存储图.一般有两种方法:邻接矩阵 ...

  7. 图论中DFS与BFS的区别、用法、详解?

    DFS与BFS的区别.用法.详解? 写在最前的三点: 1.所谓图的遍历就是按照某种次序访问图的每一顶点一次仅且一次. 2.实现bfs和dfs都需要解决的一个问题就是如何存储图.一般有两种方法:邻接矩阵 ...

  8. 数据结构基础(21) --DFS与BFS

    DFS 从图中某个顶点V0 出发,访问此顶点,然后依次从V0的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和V0有路径相通的顶点都被访问到(使用堆栈). //使用邻接矩阵存储的无向图的深度 ...

  9. dfs和bfs的区别

    详见转载博客:https://www.cnblogs.com/wzl19981116/p/9397203.html 1.dfs(深度优先搜索)是两个搜索中先理解并使用的,其实就是暴力把所有的路径都搜索 ...

随机推荐

  1. 【dedecms】DEDE列表页调用文章内容第一张图片(非缩略图)方法

    打开 ../ include/ common.func.php 添加代码 //将缩放图转变为文章第一张图片 function firstimg($str_pic) { $str_sub=substr( ...

  2. HighCharts之2D堆面积图

    HighCharts之2D堆面积图 1.HighCharts之2D堆面积图源码 StackedArea.html: <!DOCTYPE html> <html> <hea ...

  3. HighCharts中的无主题的2D折线图

    HighCharts中的无主题的2D折线图 1.设计源码 <!DOCTYPE html> <html> <head> <meta charset=" ...

  4. 五种基于RGB色彩空间统计的皮肤检测算法

    最近一直在研究多脸谱识别以及如何分辨多个皮肤区域是否是人脸的问题 网上找了很多资料,看了很多篇文章,将其中基于RGB色彩空间识别皮肤 的统计算法做了一下总结,统计识别方法主要是简单相比与很多其它基于 ...

  5. Caused by: java.lang.ClassNotFoundException: org.objectweb.asm.commons.EmptyVisitor

    1.错误描述 2014-7-13 1:45:53 org.apache.struts2.spring.StrutsSpringObjectFactory info 信息: ... initialize ...

  6. windows共享虚拟机ubuntu目录

    1)安装 sudo apt-get install samba 2)配置文件vi /etc/samba/smb.conf 添加如下 3)启动服务 sudo service smbd start 4)w ...

  7. C#图解教程 第七章 类和继承

    类和继承 类继承访问继承的成员所有类都派生自object类屏蔽基类的成员基类访问使用基类的引用 虚方法和覆写方法覆写标记为override的方法覆盖其他成员类型 构造函数的执行 构造函数初始化语句类访 ...

  8. DELL XPS 13 9350 装Win7系统(坑爹)

    0.记一次悲惨的装机记录 1.为什么这么难装呢? 因为这个NB本身是为Win10设计的,所以官网没有Win7驱动,系统设置各种不兼容 2.希望你能看到本文最后 因为你看到最后,你就不会给这个逗比装Wi ...

  9. 搭建web服务器-tomcat+apache+mysql+eclipse

    1. 下载并安装jdk 注意环境变量的配置: java_home: jdk的路径  path:.;%java_home%\bin;%java_home%\jre\bin classpath :  .; ...

  10. Rolling Update - 每天5分钟玩转 Docker 容器技术(140)

    滚动更新是一次只更新一小部分副本,成功后,再更新更多的副本,最终完成所有副本的更新.滚动更新的最大的好处是零停机,整个更新过程始终有副本在运行,从而保证了业务的连续性. 下面我们部署三副本应用,初始镜 ...