图遍历算法的应用

图遍历算法的应用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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 开通阿里云短信服务

    开通阿里云短信服务阿里云短信服务1,阿里云用户权限操作1.1、找到后台放在个人头像上面选择AccessKey管理1.2、选择子用户1.3、创建用户组1.4、给用户组添加权限然后就可以看到你的权限里面多了一个sms的短信权限1.5、创建用户注意!注意!注意点击确认后只可以看到一次密码返回就看不到了注意!注意!注意点击确认后只可以看到一次密码返回就看不到了注意!注意!注意点击确认后只可以看到一次密码返回就看不到了1.6、把用户加入到用户组2、开通阿里云短信服务

    2025年7月9日
    3
  • Vue父组件向子组件传递参数[通俗易懂]

    1、父组件projectBatchsindex.vue//使用:projectId=”this.projectId”传递参数<ProjectBatchEditref=”projectBatchEdit”:projectId=”this.projectId”@on-update=”search”></ProjectBatchEdit>importProj…

    2022年4月7日
    51
  • centos 安装 python3_python加密解密库

    centos 安装 python3_python加密解密库今天使用pip3installvirtualenv命令安装virtualenv的时候一直安装不了,

    2022年9月15日
    1
  • python实现QQ和微信刷屏[通俗易懂]

    python实现QQ和微信刷屏[通俗易懂]python实现QQ和微信刷屏看过一些用来刷屏的程序,要么就只能刷屏QQ,要么就只能刷屏微信,今天博主就来把它一起实现了,而且用法超简单的哦!!!,希望可以帮助到你!废话不多说,先上代码,然后再进行详细介绍!!!frompynputimportmouse,keyboardfromtkinterimport*importtkinter.filedialogimporttimeroot=Tk()root.title(“信息刷屏”)root.geometry(“550×200

    2022年6月11日
    93
  • MANIFEST.MF文件(PDB文件)

    打开Java的JAR文件我们经常可以看到文件中包含着一个META-INF目录, 这个目录下会有一些文件,其中必有一个MANIFEST.MF,这个文件描述了该Jar文件的很多信息,下面将详细介绍MANIFEST.MF文件的内 容,先来看struts.jar中包含的MANIFEST.MF文件内容:Manifest-Version:1.0Created-By:ApacheAnt 1.5.1…

    2022年4月15日
    43
  • 计算机专业英语复试专业问题(计算机专业笔试题)

    总述前段时间准备计算机考研复试,发现大部分的学校需要面试英语口语,但是我就一直很疑惑,老师们会怎样进行问答。通过在网上查阅和自我总结,特地将我找到的资料分享给小伙伴。祝愿所有小伙伴能考研成功。问题分类所有的问题大概会分为以下几类:一、自我介绍1、英文自我介绍2、中文自我介绍二、自我认知1、兴趣2、家庭3、优点缺点三、实践经历1、实践经历2、科研经历3、工作经历四、本校学校1、本科学校2、毕业论文五…

    2022年4月16日
    50

发表回复

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

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