图遍历算法的应用

图遍历算法的应用1.判断图的连通性图的遍历算法可以用来判断图的连通性。如果一个无向图是联通的,如果无向图是联通的,则从任一节点出发,仅需一次遍历就可以访问图中的所有节点。如果无向图是非联通的,则从某一节点出发,一次遍历仅能访问到该顶点所在联通分量的所有顶点,而对于图中其他联通分量的顶点,则无法通过这次遍历访问。对于有向图来说,若从初始点到图中的每个顶点都有路径,则能够访问到图中的所有顶点,否则不能访问到所有顶…

大家好,又见面了,我是你们的朋友全栈君。

1.判断图的连通性

图的遍历算法可以用来判断图的连通性。如果一个无向图是联通的,如果无向图是联通的,则从任一节点出发,仅需一次遍历就可以访问图中的所有节点。如果无向图是非联通的,则从某一节点出发,一次遍历仅能访问到该顶点所在联通分量的所有顶点,而对于图中其他联通分量的顶点,则无法通过这次遍历访问。对于有向图来说,若从初始点到图中的每个顶点都有路径,则能够访问到图中的所有顶点,否则不能访问到所有顶点。

2.遍历解答树

在问题求解时,对所有可能的问题解构成一颗树,而最优解或者符合要求的解就是该树的一条路径或一个节点。这种树称为解答树。
例1:通过深度优先搜索生成13的全排列

const int N = 13;
int d[N];//记录解
int v[N];//标记某个值是否被遍历过,没遍历过为0, 遍历过为1
int n;
void dfs(int depth){
    if(depth == N){
        for(int i = 0; i != n; i++){
            cout<<d[i]<<" ";
        }
        cout<<endl;
        return;
    }
    for(int i = 1; i <= n; ++i){
        if(!v[i]){
            v[i] = 1;
            d[depth] = i;
            dfs(depth+1);
            v[i] = 0;
        }
    }
}

int main(){
    cin>>n;
    memset(v, 0, n);
    dfs(0);
}

例2:有1分、2分、5分、10分四种硬币,每种硬币数量无限,给定Target分钱,求有多少种组合可以组合成Target分钱?

int count = 0;//统计有多少种组合
int Target = 0;
int coin[4] = {
  
  1,2,5,10};
int total = 0;
vector<int> res;
void dfs(int index){
    if(total == target){
        count++;
        cout<<count<<endl;
        for(int i =0 ; i < res.size(); ++i)
            cout<<res[i]<<" ";
        cout<<endl; 
    }
    if(total > target) return;
    for(int i = index; i < 4; ++i){
        total += coin[i];
        res.push_back(coin[i]);
        dfs(i);
        res.pop();
        total -= coin[i];
    }
}

int main(){
    count = 0;
    cin>>Target;
    dfs(0);
    cout<<count<<endl;
}

**例3:**DFS解决1到n个自然数组成的集合的所有组合等问题。

const int N=100;
int number = 3;
int x[N];//解向量
void dfs(int cur_depth){
    if(cur_depth >= number){
        bool test = false;
        for(int i = 0; i < number; ++i){
            if(x[i] != 0){
                cout<<i+1;
                test = true;
            }
        }
        if(test)
            cout<<endl;
        return;
    }
    x[cur_depth+1] = 0;
    dfs(cur_depth+1);
    x[cur_depth+1] = 1;
    dfs(cur_depth+1);
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/136479.html原文链接:https://javaforall.net

(0)
上一篇 2022年5月4日 下午4:40
下一篇 2022年5月4日 下午4:40


相关推荐

  • QNET-网络测试工具

    QNET-网络测试工具一 什么是 QNETQNET 腾讯 WeTest 开放平台最近推出了一款针对移动应用的弱网测试工具 QNET 解决了在 Android 设备上进行弱网络专项测试的痛点 QNET 无需 ROOT 手机 无需连接数据线 以独立 app 的方式 为用户提供给快捷 可靠 功能完善的弱网络模拟服务 另外 QNET 还有一个很好用的功能 TCP UDP 网络协议抓包 帮助开发和测试人员进行网络流量分析 而不需要 ROOT 手机 使用 tcpdump 进行抓包 QNET 网络测试工具能够不借助 PC 或服务器 搭建一套完整的弱网测试环境 进行弱网络模拟测

    2026年3月18日
    1
  • 集合转数组的方法_数组与集合的区别

    集合转数组的方法_数组与集合的区别数组集合转换数组变字符串int[]arr={4,1,8,5,3,5};System.out.println(Arrays.toString(arr));//[4,1,8,5,3,5]1、集合转数组Object[]toArrays()E[]toArrays(E[]e);有时候需要让集合围成数组,因为有时需要限定对集合中的元素操作,不需要对该…

    2026年1月26日
    5
  • setInterval和setTimeout

    setInterval和setTimeout1 总结 1 1 setTimeout 和 setInterval 的时间间隔是不可动态修改的 1 1 1 错误方式 1 1 2 正确方式 1 2 setInterval 方法的弊端 1 2 1 setInterval 间歇问题 1 2 2 遇到错误不会停止 1 3 clearTimeout 和 clearInterva 1 4 this2 win

    2026年3月18日
    1
  • 编译成功了,运行为什么会失败_如何编译内核

    编译成功了,运行为什么会失败_如何编译内核1:首先在内核文件夹当中选择编译配置文件arch/arm/configs下选则davinci_dm368_ipnc_defconfig_nand(nandflash启动),davinci_dm368_ipnc_defconfig_nfs(nfs文件系统启动)2:makemenuconfig保存退出3:makeARCH=armCROSS_COMPILE=arm_v5t_le-

    2022年8月13日
    8
  • MQ消息队列的12点核心原理总结

    MQ消息队列的12点核心原理总结1 消息生产者 消息者 队列消息生产者 Producer 发送消息到消息队列 消息消费者 Consumer 从消息队列接收消息 Broker 概念来自与 ApacheActive 指 MQ 的服务端 帮你把消息从发送端传送到接收端 消息队列 Queue 一个先进先出的消息存储区域 消息按照顺序发送接收 一旦消息被消费处理 该消息将从队列中删除 2 设计 Broker 主要考虑 1 消息

    2026年3月16日
    1
  • 天津市:纳入REITs储备库项目67个,预估可盘活资金近500亿元

    天津市:纳入REITs储备库项目67个,预估可盘活资金近500亿元

    2026年3月12日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号