图m着色问题

简介:

1 问题描述:

  给定无向图,m种不同的颜色。使每一种着色法使G中每条边的2个顶点不同颜色,若一个图最少需要m种颜色才能使图中每条边连接的2个顶点着不同颜色,则成这个数m为该图的色数。求一个图的色数m的问题称为图的m可着色优化问题。

2 算法设计

  用图的邻接矩阵a表示无向图连通图G=(V,E)。

  若存在相连的边,则a[i][j] = 1,否则 a[i][j]=0.

  整数1,2,3.。。m用来表示为一棵高度为n+1的完全m叉树。

  解空间树的第i层中每一结点都有m个儿子,每个儿子相应于x[i]的m个可能的着色之一。

  第n+1层为叶子结点。

 

在算法Backtrack,

  当i>n时,算法搜索至叶节点,得到新的m着色方案,当前找到可m着色的方案树增1.

  当i<=n时,当前扩展结点Z是解空间中的内部结点。该结点有x[i]=1,2,3.。。m共m个儿子结点。对当前扩展结点Z的每一个儿子结点,由函数OK检查其可行性,并以深度优先的方式递归地对可行子树搜索,或剪去不可行子树。

算法描述:

 

复制代码
#include <iostream>
using namespace std;
class Color{
    friend int mColoring(int,int,int* *);
private:
    bool Ok(int k);
    void Backtrack(int t);
    int n,
        m,
        * *a,
        * x;
    long sum;
};
bool Color::Ok(int k)
{
    for(int j=1;j<=n;j++)
        if((a[k][j] == 1)&&(x[j] == x[k]))
            return false;
    return true;
}
void Color::Backtrack(int t)
{
    if(t>n)
    {
        sum++;
        for(int i=1;i<=n;i++)
            cout<<x[i]<<" ";
        cout<<endl;
    }
    else
    {
        for(int i=1;i<=m;i++)
            x[t] = i;
        if(Ok(t))
            Backtrack(t+1);
        x[t] = 0;
    }
}
int mColoring(int n,int m,int * * a)
{
    Color X;
    X.n = n;
    X.m = m;
    X.a = a;
    X.sum = 0;
    int * p = new int [n+1];
    for(int i=0;i<=n;i++)
        p[i] = 0;
    X.x = p;

    X.Backtrack(2);

    delete [] p;
    return X.sum;
}
int main()
{
    int n,m;
    cout<<"请输入想要确定的m着色图中m的值:"<<endl;
    cin>>m;
    cout<<endl<<"共有n个结点,n的值为:"<<endl;
    cin>>n;
    int **arr = new int [n][n];
    for(int i=0;i<n;i++)
    {
        cout<<"请输入连接矩阵的第一行的数(0-1)"<<endl;
        for(int j=0;j<n;j++)
        {
            cin>>arr[i][j];
        }
    }
    mColoring(n,m,arr);
    return 0;
}
复制代码

运行结果:

复制代码
--------------------Configuration: test102501 - Win32 Debug--------------------
Compiling...
test.cpp
E:\study file\ACM\test102501\test.cpp(63) : error C2540: non-constant expression as array bound
E:\study file\ACM\test102501\test.cpp(63) : error C2440: 'initializing' : cannot convert from 'int (*)[1]' to 'int ** '
        Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
Error executing cl.exe.

test.obj - 2 error(s), 0 warning(s)
复制代码

还是不会指针数组的传参...有空看看,mark一下

本文转自博客园xingoo的博客,原文链接:图m着色问题,如需转载请自行联系原博主。
相关文章
|
2月前
|
存储 数据可视化 API
第5章-着色基础-5.3-实现着色模型
第5章-着色基础-5.3-实现着色模型
11 0
|
4月前
|
机器学习/深度学习 图形学
神笔马良画出三维世界,基于线稿的3D生成编辑方法SketchDream来了
【6月更文挑战第10天】研究人员推出SketchDream系统,将手绘草图与文本描述转化为3D模型,简化了3D内容创作过程。该系统基于深度学习的多模态生成模型,结合草图和文本信息,实现高质量3D生成与编辑。尽管有局限性,如依赖预训练模型和对复杂编辑任务的处理能力,SketchDream在3D生成和编辑方面表现出色,降低了3D建模的门槛。[论文链接](https://arxiv.org/pdf/2405.06461)
56 1
|
5月前
|
存储 数据可视化 关系型数据库
绘制圆环图/雷达图/星形图/极坐标图/径向图POLAR CHART可视化分析汽车性能数据
绘制圆环图/雷达图/星形图/极坐标图/径向图POLAR CHART可视化分析汽车性能数据
|
5月前
|
存储 数据可视化
创建乐高版马赛克图
创建乐高版马赛克图
85 0
|
算法 索引 Python
使用遗传算法解决图着色问题
图着色任务可以简单概括为:为图中的每个节点分配一种颜色,并保证相连接的节点对不会使用相同的颜色,同时,我们希望使用尽可能少的颜色。本文使用遗传算法解决图着色问题。
1827 0
使用遗传算法解决图着色问题
L2-023 图着色问题 (25 分)(图的遍历)
L2-023 图着色问题 (25 分)(图的遍历)
62 0
|
自然语言处理 JavaScript 前端开发
【计算机图形学】六面体旋转并实时切换虚线实线 - 代码实现
【计算机图形学】六面体旋转并实时切换虚线实线 - 代码实现
813 0
【计算机图形学】六面体旋转并实时切换虚线实线 - 代码实现
|
存储
L2-023 图着色问题 (25 分)
L2-023 图着色问题 (25 分)
111 0
L2-023 图着色问题 (25 分)
|
开发者 Python
3D 图绘制|学习笔记
快速学习3D 图绘制
180 0
3D 图绘制|学习笔记
L2-023 图着色问题 (25 分)(图论)
L2-023 图着色问题 (25 分)(图论)
380 0