首页 > 其他分享 >图的m着色问题-回溯法-深度搜索

图的m着色问题-回溯法-深度搜索

时间:2023-05-25 17:04:57浏览次数:56  
标签:pointnum int sum 着色 搜索 回溯 100 方法


问题描述:

给定无向连通图G=(V, E)和m种不同的颜色,用这些颜色为图G的各顶点着色,每个顶点着一种颜色。是否有一种着色法使G中相邻的两个顶点有不同的颜色。这个问题是图的m可着色判定问题。若一个图最少需要m种颜色才能使图中每条边连接的两个顶点着不同颜色,则称这个数m为该图的色数。求一个图的色数m的问题称为图的m可着色优化问题。

算法设计:

回溯法: 如果会了装载问题 和 0-1背包的回溯解法,这个题目容易解出。代码如下:

代码:

#include <bits/stdc++.h>
using namespace std;
int m;
int pointnum;
int edgenum;
int sum = 0;
int Graph[100][100];
int x[100];
void InPut()
{
    int pos1, pos2;
    scanf("%d %d", &pointnum, &m);
    scanf("%d", &edgenum);
    memset(Graph, 0, sizeof(Graph));
    for(int i = 1; i <= edgenum; ++i)
    {
        scanf("%d %d", &pos1, &pos2);
        Graph[pos1][pos2] = Graph[pos2][pos1] = 1;
    }
}
bool IsOk(int i)
{
    for(int j = 1; j < i; ++j)
        if(Graph[i][j] == 1 && x[j] == x[i])
            return false;
    return true;
}
void BackTrack(int i)
{
    if(i > pointnum)
    {
        sum += 1;
        printf("方法 %d : ", sum);
        for(int j = 1; j <= pointnum; ++j)
        {
            printf("%d ", x[j]);
        }
        printf("\n");
        return;
    }
    else
    {
        for(int j = 1; j <= m; ++j)
        {
            x[i] = j;
            if(IsOk(i))
                BackTrack(i + 1);
            x[i] = 0;
        }
    }
}
void OutPut()
{
    printf("一共有 %d 中绘色方案", sum);
}
int main()
{
    InPut();
    BackTrack(1);
    OutPut();
}

测试样例:

输入:

5 4
8
1 3
1 2
1 4
2 3
2 4
2 5
3 4

4 5

输出:

方法 1 : 1 2 3 4 1
方法 2 : 1 2 3 4 3
方法 3 : 1 2 4 3 1
方法 4 : 1 2 4 3 4
方法 5 : 1 3 2 4 1
方法 6 : 1 3 2 4 2
方法 7 : 1 3 4 2 1
方法 8 : 1 3 4 2 4
方法 9 : 1 4 2 3 1
方法 10 : 1 4 2 3 2
方法 11 : 1 4 3 2 1
方法 12 : 1 4 3 2 3
方法 13 : 2 1 3 4 2
方法 14 : 2 1 3 4 3
方法 15 : 2 1 4 3 2
方法 16 : 2 1 4 3 4
方法 17 : 2 3 1 4 1
方法 18 : 2 3 1 4 2
方法 19 : 2 3 4 1 2
方法 20 : 2 3 4 1 4
方法 21 : 2 4 1 3 1
方法 22 : 2 4 1 3 2
方法 23 : 2 4 3 1 2
方法 24 : 2 4 3 1 3
方法 25 : 3 1 2 4 2
方法 26 : 3 1 2 4 3
方法 27 : 3 1 4 2 3
方法 28 : 3 1 4 2 4
方法 29 : 3 2 1 4 1
方法 30 : 3 2 1 4 3
方法 31 : 3 2 4 1 3
方法 32 : 3 2 4 1 4
方法 33 : 3 4 1 2 1
方法 34 : 3 4 1 2 3
方法 35 : 3 4 2 1 2
方法 36 : 3 4 2 1 3
方法 37 : 4 1 2 3 2
方法 38 : 4 1 2 3 4
方法 39 : 4 1 3 2 3
方法 40 : 4 1 3 2 4
方法 41 : 4 2 1 3 1
方法 42 : 4 2 1 3 4
方法 43 : 4 2 3 1 3
方法 44 : 4 2 3 1 4
方法 45 : 4 3 1 2 1
方法 46 : 4 3 1 2 4
方法 47 : 4 3 2 1 2
方法 48 : 4 3 2 1 4

一共有 48 中绘色方案

部分截图:

图的m着色问题-回溯法-深度搜索_图的m着色问题

标签:pointnum,int,sum,着色,搜索,回溯,100,方法
From: https://blog.51cto.com/u_16129621/6350069

相关文章

  • 0-1背包问题 - 回溯法 - 深度搜索
    算法描述:0-1背包问题是子集选取问题。一般情况下,0-1背包问题是NP难得。0-1背包问题的解空间可用子集树表示。在搜索解空间的时,只要其左儿子节点是一个可行节点,搜索就进去其左子树(约束条件)。当右子树中可能包含最优解时才进入右子树搜索(限界函数)。否则就将右子树剪去。计算右子......
  • 装载问题(最优装载问题变形)-回溯法-深度搜索
    问题描述:有n个集装箱要装上2艘载重量分别为c1和c2的轮船,其中集装箱i的重量为wi,且∑wi<=c1+c2。问是否有一个合理的装载方案,可将这n个集装箱装上这2艘轮船。如果有,找出一种装载方案。问题分析:如果一个给定装载问题有解,则采用下面的策略可得到最优装载方案。(1)首先将第一艘轮船......
  • 2-3 改写二分搜索算法
    设a[0:n-1]是已排好序的数组。请改写二分搜索算法,使得当搜索元素x不在数组中时,返回小于x的最大元素的位置i和大于x的最小元素位置j。当搜索元素在数组中时,i和j相同,均为x在数组中的位置。测试数据(自己写的):61234567输出:i=5,j=-16123456-1输出:i=-1,j=......
  • 衡量搜索相关性
    [Howintheheckdoyoumeasuresearchrelevance?](https://www.reddit.com/r/RedditEng/comments/te0gfz/how_in_the_heck_do_you_measure_search_relevance/)[MeasuringSearchRelevance,Part2:nDCGDeepDive](https://www.reddit.com/r/RedditEng/comments/y6idrl/......
  • P1795 求解图的 m 着色问题
    #include<iostream>usingnamespacestd;intk,v,m;//v顶点k边数m颜色种类intans;//记录最后答案intcol[1010];//标记每个顶点所图颜色intgraph[1010][1010];//二维数组存图booljudge(intp,int......
  • 力扣---450. 删除二叉搜索树中的节点
    给定一个二叉搜索树的根节点root和一个值key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。一般来说,删除节点可分为两个步骤:首先找到需要删除的节点;如果找到了,删除它。 示例1: 输入:root=[5,3,6,2,4,nu......
  • 路径总和 leetcode——递归+回溯
    题目leetcode:113代码与解析这道题可以看做leetcode112和leetcode257合体这道题要遍历整棵树,把所有符合条件的路径添加进去,所以不需要返回值递归三部曲:确定参数和返回值要传入当前节点,和总和,不需要返回值确定终止条件如果当前节点没有叶子结点,并且和等于target.那么添加进r......
  • Oceans on a Shoestring: Shape Representation, Meshing and Shading(低成本的海洋:形
    作者:HuwBowles单位:StudioGoboIntroduction(简介):StudioGoboisasmallteamoftalenteddevelopersbasedinBrighton/UKTheCrew(成员):BenAndrews,PaulAyliffe,AnastasiosBrakis,JimCallin,ClementDagneauKevinHayes,WillMyles,OlliverReid-Smith,Phi......
  • day01【704. 二分查找,35.搜索插入位置 ,27. 移除元素 】
    704.二分查找二分查找理论二分查找是一个时间效率极高的算法,尤其是面对大量的数据时,其查找效率是极高,时间复杂度是log(n)。主要思想就是不断的对半折叠,每次查找都能除去一半的数据量,直到最后将所有不符合条件的结果都去除,只剩下一个符合条件的结果。二分查找需要的条件用于......
  • elasticsearch/es搜索服务器介绍
    目录1、ElasticSearch介绍1.1原理与应用2、ElasticaSearch的的安装使用2.1安装2.2配置文件2.3启动ES2.4head插件安装1、ElasticSearch介绍我们先来看下百度百科的介绍:ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTfulwe......