定义结点

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. l【linux】linux rpm包命名规范

    RPM包的一般格式为:name-version-arch.rpmname-version-arch.src.rpm name:软件包名称.version:带有主.次和修订的软件包版本.arch:硬件平 ...

  2. Java注释分类

    Java注释分类 1.单行注释    //打印结果    System.out.println("结果是:"+result); 2.多行注释    /**     * @autho ...

  3. 利用Windows性能计数器(PerformanceCounter)监控

    一.概述 性能监视,是Windows NT提供的一种系统功能.Windows NT一直以来总是集成了性能监视工具,它提供有关操作系统当前运行状况的信息,针对各种对象提供了数百个性能计数器.性能对象,就 ...

  4. RHEL64 缺少ISO 9660图像 安装程序试图挂载映像#1,在硬盘上无法找到该映像

    用光盘安装Linux,很容易,按照提示一步一步就好.如果没有光驱,只好想办法用硬盘或者U盘安装了. 首先说说怎样用U盘启动Linux的安装程序:1.将ISO镜像文件拷贝到U盘中,并解压到U盘根目录.将 ...

  5. hdu5820 Lights

    主席树 但是能够想到题解的做法很难 #include <stdio.h> #include <string.h> #include <vector> #includ ...

  6. C#读取Excel表格中数据并返回datatable

    在软件开发的过程中,经常用到从excel表格中读取数据作为数据源,以下整理了一个有效的读取excel表格的方法. DataTable GetDataTable(string tableName,str ...

  7. Crash CodeForces - 417B

    During the "Russian Code Cup" programming competition, the testing system stores all sent ...

  8. Metrics.net + influxdb + grafana 构建WebAPI的自动化监控和预警

    前言 这次主要分享通过Metrics.net + influxdb + grafana 构建WebAPI的自动化监控和预警方案.通过执行耗时,定位哪些接口拖累了服务的性能:通过请求频次,设置适当的限流 ...

  9. js 几种排序方法

    1.冒泡排序 var arr = [9, 7, 5, 3, 1]; for (var i = 0; i < arr.length - 1; i++) { for (var j = 0; j &l ...

  10. 【BZOJ2127】happiness(最小割)

    [BZOJ2127]happiness(最小割) 题面 Description 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了, ...