zoukankan      html  css  js  c++  java
  • 图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一下

  • 相关阅读:
    strcpy ,strncpy ,strlcpy(转载)
    窗口刷新时的问题(转)
    Linux下的实时流媒体编程(RTP,RTCP,RTSP)
    YUV色彩空间(转自百度百科)
    VC++2005快速构建安全的应用程序
    Linux多线程编程
    C++ PASCAL关键字(转)
    SkinMagic 进行皮肤设置
    .h和.cpp文件的区别
    strcpy_s与strcpy安全性的比较(转载)
  • 原文地址:https://www.cnblogs.com/xing901022/p/2740017.html
Copyright © 2011-2022 走看看