蓝桥杯算法笔记<4>使用vector存图

本文介绍了如何使用C++中的vector和Edge结构体高效存储稀疏图,并结合C11的dfs遍历算法,演示了如何计算图的直径。重点讲解了无向图的边的双向存储和使用vector进行图的遍历操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

图的存储有多种方式,对于稀疏图,可以用邻接表来存储,对于稠密图,可以用邻接矩阵存储
在实际的考试中,使用vector(动态数组)能十分便捷地存储稀疏图
例题:
第四届蓝桥杯A组真题:大臣的旅费
题目链接:
https://www.acwing.com/problem/content/description/1209/

这题中,需要存储节点数量较大, 属于稀疏图
需要使用vector存图后,找到图的直径

闫老板在相关讲解中,提到了如下几点:

  • 1.定义一个结构体 ,第一个点是编号,第二个是长度,这个结构体用于存储每一条边
struct Edge{ 
   int id,w;
};
  • 2.开N个类型为Edge的vector,用于存图,
vector<Edge> h[N];
  • 3.由于是无向图,对于每一条输入,需要添加a->b和b->a两条边,这里需要注意vector中,push_back()的使用
 for(int i=0;i<n-1;i++)
    {
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        h[a].push_back({b,c});
        h[b].push_back({a,c});
    }
  • 关于vector的遍历方式:
    C11引入了一种新的遍历方式:
    void dfs(int u,int father,int distance)
    {
     dist[u]=distance;
     for(auto node :h[u])  //C11新的遍历方式
     {
         if(node.id!=father)
         {      
               dfs(node.id,u,distance+node.w);
    
         }
     }
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值