You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在带权邻接表图上实现DFS?解决类型转换编译错误

问题解决:带权图邻接表的DFS遍历类型不匹配错误

错误原因

编译器报错error: cannot convert 'std::pair<int, int>' to 'int' in initialization的本质是:adjListWeighted[0]是std::vector<std::pair<int, int>>类型,存储的是邻接节点+对应权重的键值对,而你用int类型的变量接收这些键值对,导致类型不匹配。

修正方案

根据你对节点和权重的需求,有几种调整方式:

1. 同时获取邻接节点和权重(带权图常用)

直接用std::pair<int, int>或auto接收每个边元素,再通过first/second访问节点和权重:

#include <vector>
#include <utility>
int main()
{
    std::vector<std::vector<std::pair<int, int>>> adjListWeighted(1);
    adjListWeighted[0].push_back({1, 5});
    
    // 用auto简化类型声明
    for (auto edge : adjListWeighted[0]) {
        int neighbor = edge.first;  // 获取邻接节点编号
        int weight = edge.second;   // 获取边的权重
        // 这里编写DFS逻辑,比如递归访问neighbor节点,同时可利用weight做相关处理
    }
}

如果你的编译器支持C++17及以上,用结构化绑定会更简洁:

for (auto [neighbor, weight] : adjListWeighted[0]) {
    // 直接使用neighbor和weight变量编写DFS逻辑
}

2. 仅获取邻接节点(若暂时不需要权重)

如果你的DFS当前只需要遍历节点,可直接提取pair的first成员:

for (auto& edge : adjListWeighted[0]) {
    int neighbor = edge.first;
    // 执行DFS节点访问逻辑
}

补充说明

带权图的DFS核心逻辑确实和无权图一致,只是邻接表多存储了权重信息。你只需要调整循环中对邻接表元素的访问方式,不需要修改DFS的递归/栈核心逻辑。

内容的提问来源于stack exchange,提问作者Christian Tallett

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 23:03:20