图的遍历

1、图的深度优先遍历

基本思想:访问节点v0,然后访问v0邻接到的未被访问的顶点v1,再从v1出发,按照深度优先方式遍历,一直递归到所有顶点的邻接点都被访问,则递归结束。其意义是沿着图的某一分支进行遍历,知道末端然后回溯,沿着另一个分支进行同样遍历,知道所有分支都被遍历过结束。

2、图的宽度优先遍历

基本思想:先访问顶点v0,然后访问v0邻接到的所有未被访问的顶点,在一次访问这些顶点邻接到的所有未被访问的节点,直到所有节点都被访问。


#include
   
   
    
    
#include
    
    
     
     
#include
     
     
      
      
#include
      
      
       
       
using namespace std;

#define v 100

int head[v];
struct Edgenode
{
    int to;
    int w;
    int next;
}edge[v];

bool s[v] = {0};
void dfs(int x)
{
    s[x] = true;
    printf("%d\n",x);
    int i;
    for(i = head[x]; i != -1; i = edge[i].next)
    {
        if(!s[edge[i].to])
            dfs(edge[i].to);
    }
}
void bfs(int x)
{
    memset(s,0,sizeof(s));
    int queue[v];
    int iq = 1;
    queue[iq++] = x;
    int i,k;
    for(i = 1; i < iq; i++)
    {
        //每次从队头取节点,一定是下一个带扩展节点
        printf("%d\n",queue[i]);
        //遍历当前节点相连的节点,如果没有被访问过则入队
        for(k = head[queue[i]]; k != -1; k = edge[k].next)
        {
            if(!s[edge[k].to])
                queue[iq++] = edge[k].to;
        }
    }
}
int main()
{
    int i,j,w,m,n;
    scanf("%d %d",&n,&m);//m:边的数目 ,n: 点的数目
    int k = 1;
    memset(head,-1,sizeof(head));
    while(k <= m)
    {
        cin>>i>>j>>w;
        edge[k].to = j;
        edge[k].w = w;
        //数组模拟链表的主要方式是记录下一个节点在数组的哪个位置
        edge[k].next = head[i];
        head[i] = k;//存储描述点i边信息的链的起点在edge数组中的位置。
        k++;
        //构造前向星是将信加入的节点放到对用链的最开始并修改head数组中对应的位置
    }
    cout<<"-------------dfs----------------"<
       
       
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值