定义结点

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. 获取NVIDIA显卡的温度

    NVIDIA显卡在硬件上有温度传感器,可以感知显卡的运行环境.温度数据的获取,一般是通过调用NVIDIA的SDK的相关函数即可.SDK的下载的网址(https://developer.nvidia.c ...

  2. STM32——GPIO之从库函数到寄存器的前因后果

    例子为单片机的"Hello World"级的流水灯实验--虽然只有一个,其中并不是将完整的代码给出,只是给出关键部分来说明"如何调用ST公司的的库来完成对硬件的控制,以及 ...

  3. MySQL查看最大连接数和修改最大连接数

    MySQL查看最大连接数和修改最大连接数 1.查看最大连接数       show variables like '%max_connections%'; 2.修改最大连接数       set GL ...

  4. Netty的并发编程实践4:线程安全类的应用

    在JDK1.5的发行版本中,Java平台新增了java.util.concurrent,这个包中提供了一系列的线程安全集合.容器和线程池,利用这些新的线程安全类可以极大地降低Java多线程编程的难度, ...

  5. 为什么选择Netty作为基础通信框架?

    在开始之前,我先讲一个亲身经历的故事:曾经有两个项目组同时用到了NIO编程技术,一个项目组选择自己开发NIO服务端,直接使用JDK原生的API,结果两个多月过去了,他们的NIO服务端始终无法稳定,问题 ...

  6. 采用Global.asax的Application_BeginRequest事件过滤敏感字符

    1.特殊字符过滤公共类ProcessRequest.cs using System.Web.UI; using System.Web.UI.WebControls; using System.Web. ...

  7. 芝麻HTTP:

    只要你的Scrapy Field字段名字和 数据库字段的名字 一样.那么恭喜你你就可以拷贝这段SQL拼接脚本.进行MySQL入库处理. 具体拼接代码如下: def process_item(self, ...

  8. 使用Python收集获取Linux系统主机信息

    爬虫代理IP由芝麻HTTP服务供应商提供 使用 python 代码收集主机的系统信息,主要:主机名称.IP.系统版本.服务器厂商.型号.序列号.CPU信息.内存等系统信息. #!/usr/bin/en ...

  9. hdu5887 Herbs Gathering

    神他妈随便写写就能过- 暴力枚举每个取不取 两个剪纸: 1.当剩下可用的时间小于最少需要用的时间 跳出 2.当剩下的植物按照理想情况(甚至可以取一部分)得到的极限答案比已经求出的答案大 跳出 #inc ...

  10. 【BZOJ1003】物流运输(动态规划,最短路)

    [BZOJ1003]物流运输(动态规划,最短路) 题面 Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司 ...