图的遍历 无向图深搜 宽搜

简介: 图的遍历 无向图深搜 宽搜

导航


1.无向图的遍历 深搜

2.无向图遍历 宽搜


——————————————————————————————————————


1.无向图的遍历



按照深搜遍历顺序是:1 2 4 3 5


首先要建立图表:n*n的表格



其中1为两个点连接,无穷是没有关系,0是自身不会有连接


设计这么一张表就是为了能够进行深搜,我们一步步来看

从第一行开始,找到第一个为1的点是2

进入第二行,其中第二行第一个已经访问过了,接着找到第二行第四个位置没有访问过

进入到第四行,2访问过了,接着重新回到第一行中,此时访问3

进入第三行,其中1访问过了,5没有访问过

进入第五行,其中的1和3都访问过了,此时再回到第一行,第一行的第5页访问过了,此时就结束了。


那么顺序依次就是1 2 4 3 5


代码


//图的遍历
#include <stdio.h>
int e[101][101],sum,book[101],n;
void dfs(int cur)
{
  int i;
  printf("%d ",cur);
  sum++;   //每访问一个点加1
  if(sum==n) return ;
  //开始从1号开始尝试
  for(i=1;i<=n;i++){
  if(e[cur][i]==1&&book[i]==0)
  {
    book[i]=1;
    dfs(i);
  }
  } 
}
int main()
{
  int m,a,b,i,j;
  //输入矩阵的高宽 
  scanf("%d%d",&n,&m);
  //初始化矩阵
  for(i=1;i<=n;i++)
  for(j=1;j<=n;j++)
    if(i==j)
    e[i][j]=0;
    else
    e[i][j] = 9999999; //假设这里为无穷
    //开始读入顶点之间的边
  for(i=1;i<=m;i++){
  scanf("%d%d",&a,&b);
  e[a][b]=1;
  e[b][a]=1;  //这里是无向图,就用1来赋值 
  } 
  //首先从1号开始出发
  book[1]=1;
  dfs(1); 
  return 0;
}


运行结果:



解析代码:

1.首先输入的n是顶点数,m是边数,对表格进行赋值,输入每对边的两个顶点,再对表格进行二次赋值

2.开始进行dfs深搜,访问表格第一行开始,首先便输出1,然后继续找到为1的位置,并且对已经访问过的进行标记,然后进入对应行,在进行整行遍历

3.接着就跟上述一样知道第一行所有都访问过去了,才结束,此时就已经得到了深搜的顺序


——————————————————————————————————————


2.无向图遍历 宽搜



建立表格:



输入条件:

5 5

1 2

1 3

1 5

2 4

3 5


代码:


#include <stdio.h>
int main()
{
  int que[10001],head,tail,n,m,a,b,cur;
  int book[101]={0},e[101][101];
  int i,j;
  //输入顶点数和边数
  scanf("%d%d",&n,&m);
  for(i=1;i<=n;i++)
  for(j=1;j<=n;j++)
    if(i==j)
    e[i][j]=0;
    else
    e[i][j]=999999;
  for(i=1;i<=m;i++){
  scanf("%d%d",&a,&b);
  e[a][b]=1;
  e[b][a]=1;  
  }
  //队列初始化
  head=1;
  tail=1;
  que[tail]=1;
  tail++;
  book[1]=1;
  //当队列不为空的时候循环
  while(head<tail)
  {
  cur = que[head];  //cur为当前访问的顶点编号
  for(i=1;i<=n;i++){
    //判断是否有边 并且没有被访问过
    if(e[cur][i]==1&&book[i]==0)
    {
    que[tail]=i;
    tail++;
    book[i]=1;
    } 
    //如果tail大于n了,就说明顶点都已经访问过了
    if(tail>n){
    break;
    } 
  } 
  head++; 
  } 
  //进行遍历队列了 
  for(i=1;i<tail;i++)
  printf("%d ",que[i]);
  return 0;
}



运行结果:



使用队列来存储依次访问到的节点


相关文章
|
6月前
|
算法
最短路之Floyd算法
最短路之Floyd算法
75 1
|
6月前
|
算法
最短路之Dijkstra算法
最短路之Dijkstra算法
57 0
|
5月前
|
算法
Tarjan 求有向图的强连通分量
Tarjan算法是一种用于查找有向图中强连通分量的高效方法。作者分享了自己的笔记,强调了网上解释的不清晰性,并引用了OI Wiki的资源。算法维护每个节点的`dfn`(深度优先搜索顺序)和`low`(能到达的最小DFS序)。通过遍历节点和其邻接节点,更新`low`值,识别环路。当`dfn[x] == low[x]`,表示找到一个强连通分量。代码示例展示了具体的实现细节。
|
5月前
|
存储
第5章 图的遍历
第5章 图的遍历
拓扑排序(邻接表实现)
拓扑排序(邻接表实现)
181 0
拓扑排序(邻接表实现)
|
机器学习/深度学习 算法
无向图的算法:Kruskal算法与Prim算法生成最小生成树
无向图的算法:Kruskal算法与Prim算法生成最小生成树
183 0
|
算法
最小生成树:Kruskal算法(邻接表+最小堆+并查集)
最小生成树:Kruskal算法(邻接表+最小堆+并查集)
259 0
最小生成树:Kruskal算法(邻接表+最小堆+并查集)