回溯法--最大团问题

这篇具有很好参考价值的文章主要介绍了回溯法--最大团问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题描述

什么是最大团?最大团的定义?

最大团问题,算法笔记,算法,Powered by 金山文档

完全图:如果无向图中的任何一对顶点之间都有一条边,这种无向图称为完全图。

完全子图:给定无向图G=(V,E)。如果U⊆V,且对任意u,v⊆U 有(u,v) ⊆ E,则称U 是G 的完全子图。

团(最大完全子图): U是G的团当且仅当U不包含在G 的更大的完全子图中

最大团:G 的最大团是指G中所含顶点数最多的团。

空子图:给定无向图G=(V,E)。如果U⊆V,且对任意u,v⊆U 有(u,v) ∉ E,则称U 是G 的空子图。G的空子图U是G的独立集当且仅当U不包含在G的更大空子图中。

独立集:对于给定无向图G=(V,E)。如果顶点集合V*⊆V,若V*中任何两个顶点均不相邻,则称V*为G的点独立集,或简称独立集。

最大独立集:G中所含顶点数最多的独立集。

无向图G的最大团问题 和 最大独立集问题都可以用回溯法在最大团问题,算法笔记,算法,Powered by 金山文档的时间内解决。

图G的最大团问题可以看做是图G的顶点集V的子集选取问题

回溯法有两种模板--子集树和排列树。最大团问题就可以用子集树来表示问题的解空间。

问题分析

设当前扩展节点Z位于解空间树的第i层,进入左子树前(选取这个点i),必须确认从点i到已经选入的点集中的每一个点都有边相连。进入右子树前(不选择这个点i),必须确认还有足够多的可以选择的点,使得有可能在右子树中找到更大的团。

详细描述

思路:首先设最大团为一个空团,往其中加入一个顶点,然后依次考虑每个顶点,查看该顶点加入团之后仍然构成一个团,如果可以,考虑将该顶点加入团,或者舍弃两种情况,如果不行,直接舍弃,然后递归判断下一顶点。对于无连接或者直接舍弃两种情况,在递归前,可采用剪枝策略来避免无效搜索。

判断条件:为了判断当前顶点加入团之后是否仍是一个团,只需要考虑该顶点和团中顶点是否都有连接。

剪枝策略:如果剩余未考虑的顶点数加上团中顶点数不大于当前解的顶点数,可停止继续深度搜索,否则继续深度递归。

书上的伪代码是这样的:

首先定义一下初始的变量

最大团问题,算法笔记,算法,Powered by 金山文档

回溯主函数:

最大团问题,算法笔记,算法,Powered by 金山文档

还是很有回溯框架--子集树模板的样子,思考清楚进入左子树和进入右子树的条件,剪枝,(单层遍历逻辑)就可以轻而易举拿下了。

//最大团问题
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int maxnum = 101;
bool a[maxnum][maxnum]; //图的邻接矩阵
bool x[maxnum];         //当前解
int cn;                 //当前团的顶点数
int bestn;              //当前的最优解
int n;                  //图G的顶点数
int e;                  //图G的边数
void display(){
    for (int j = 1; j <= n; j++){
        if (x[j] == true) printf("%d ", j);
    }
    printf("\n");
}
void backtrack(int i){
    int j;
    if (i > n)//到达叶子节点
    {
        bestn = cn;//更新最优值
        printf("%d\n", bestn);//输出详细的信息
        display();
        return;
    }
    bool ok = true;
    for (j = 1; j < i; j++){
        if (x[j] && !a[j][i]) {// i与j不相连
            ok = false;
            break;
        }
    }
    //检查是否这个点与其他所有顶点都有边相连,符合条件,进入左子树
    if (ok){
        cn++;
        x[i] = true;
        backtrack(i + 1);//检查下一个顶点
        cn--;//还原现场
    }
    if (cn + n - i > bestn) //剪枝
    {
        x[i] = false;
        backtrack(i + 1);
    }
}

int main(){
    int i, u, v;
    //初始化
    memset(a, false, sizeof(a));
    memset(x, false, sizeof(x));
    scanf("%d%d", &n, &e); // 定点数,边数
    for (i = 0; i < e; i++)
    {
        scanf("%d%d", &u, &v);
        a[u][v] = true;
        a[v][u] = true;
    }
    cn = bestn = 0;
    backtrack(1);
    return 0;
}

/*
5 7
1 2
1 4
1 5
2 5
2 3
3 5
4 5
*/

又是一道回溯法的题目,和最优装载这个问题及其相似

相似--最优装载

最大团问题,算法笔记,算法,Powered by 金山文档

分析:第一艘船尽可能装的多,还是一个子集的选取问题

思路分析:

最大团问题,算法笔记,算法,Powered by 金山文档

子集树分析结束~文章来源地址https://www.toymoban.com/news/detail-774386.html

到了这里,关于回溯法--最大团问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 算法通过村第十八关-回溯|青铜笔记|什么叫回溯(中篇)

    提示:阳光好的时候,会感觉还可以活很久,甚至可以活出喜悦。 --余秀华 回溯是非常重要的算法思想之一,主要解决一些暴力枚举也搞不定的问题(这里埋个坑💣)例如组合、分割、子集、棋盘等等。从性能角度来看回溯算法的效率并不是很高,但是对于暴力也解决不了

    2024年02月06日
    浏览(46)
  • 【回溯算法】旅行商问题--TSP问题

    一销售商从n个城市中的某一城市出发,不重复地走完其余n—1个城市并回到原出发点,在所有可能的路径中求出路径长度最短的一条。本题假定该旅行商从第1个城市出发。 输入 对每个测试例,第1行有两个整数:n(4≤n≤10)和m(4≤m≤20 ) ,n是结点数,m是边数。 接下来m行,描

    2024年02月08日
    浏览(51)
  • 回溯算法--01背包问题

    目录 回溯算法--01背包问题 [算法描述] [回溯法基本思想] 法一: 法二:  代码:  运行结果 代码改进  0-1背包问题是子集选取问题。一般情况下,0-1背包问题是NP完全问题。0-1背包问题的解空间可以用子集树表示。 解0-1背包问题的回溯法与解装载问题的回溯法十分相似。 在

    2023年04月09日
    浏览(38)
  • 旅行商问题(回溯算法)

    回溯问题适合于解由向量的形式来构成的,这个向量空间中使用搜索的方法进行搜索,搜索使用宽度优先的方法。货郎问题又名旅行商问题,但其实更多教科书中更通用的叫法叫旅行商问题,下面来对旅行商问题使用回溯算法证明。 有n个城市,已知任两个城市之间的距离,

    2024年02月06日
    浏览(51)
  • 金山办公推出WPS AI,开放应用于智能文档

    🦉 AI新闻 🚀 金山办公推出WPS AI,开放应用于智能文档 摘要:金山办公宣布WPS AI正式面向社会开放,首先用于WPS智能文档,该产品支持内容生成、表达优化、文档理解及处理等功能。用户可通过WPS客户端、App、金山文档小程序以及官网进行体验。WPS智能文档具备内容生成、

    2024年02月09日
    浏览(43)
  • 【回溯算法篇】N皇后问题

    🌠 作者:@ 阿亮joy. 🎆 专栏:《数据结构与算法要啸着学》 🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 n 皇后问题研究的是如何将 n 个皇后放置在 n × n 的棋盘上,并且使皇后彼此之间不能相互攻击。

    2024年01月16日
    浏览(38)
  • 算法与数据结构——递归算法+回溯算法——八皇后问题

    八皇后问题是一个经典的回溯算法问题,目的是在8×8的国际象棋棋盘上放置八个皇后,使得没有皇后可以互相攻击(即没有两个皇后在同一行、同一列或同一对角线上)。 回溯算法是一种解决问题的算法,它通过尝试所有可能的解决方案来解决问题。在八皇后问题中,计算

    2024年02月09日
    浏览(55)
  • 算法:回溯算法(以解决n皇后问题为例)

    基本思想:回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。八皇后问题就是回溯算法的典型,第一步按照顺序放一个皇后,然后第二步符合要求放第2个皇后,如果没有位置符合要求,那么就要改变第一个皇后的位置,重新放第2个皇后

    2024年02月05日
    浏览(32)
  • 【算法设计与分析】3.回溯法—地图填色问题

    回溯法地图填色pre ppt 回溯法地图填色报告word 回溯法地图填色c++源代码 目录 相关资源下载 碎碎念 概览 背景知识 问题描述: 原理 回溯算法原理 回溯法涉及几个概念 回溯法伪代码 地图填色(回溯法) 搜索顺序策略(按优先级排序) 剪枝策略 地图数据获取 回溯填色伪代码

    2023年04月22日
    浏览(37)
  • leetCode 131.分割回文串 + 动态规划 + 回溯算法 + 优化 + 图解 + 笔记

    我的往期文章: leetCode 647.回文子串 动态规划 + 优化空间 / 中心扩展法 + 双指针-CSDN博客 https://blog.csdn.net/weixin_41987016/article/details/133883091?spm=1001.2014.3001.5501 leetCode 131.分割回文串 + 回溯算法 + 图解 + 笔记-CSDN博客 https://blog.csdn.net/weixin_41987016/article/details/134700907?spm=1001.2014.3001

    2024年02月05日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包