zoukankan      html  css  js  c++  java
  • 算法分析与设计(work12)

    1、问题

    图的 (m) 着色问题。给定无向连通图 (G)(m) 种颜色,用这些颜色给图
    的顶点着色,每个顶点一种颜色。如果要求 (G) 的每条边的两个顶点着不
    同颜色。给出所有可能的着色方案;如果不存在,则回答“(NO)”。

    2、解析

    (G)(n) 个点,有 (m) 种颜色可以选择,那么可以转化为一棵深度为 (n)(m) 叉树。
    使用回溯法来解决,首先将 (cut=1) 传入 (dfs),表示从第 (1) 个点开始涂色,涂的时候颜色从 (1sim m),对于某个颜色,我们需要检查这个颜色是否可涂,如果可以就把 (cnt+1) 传入 (dfs),否则就改别的颜色。
    (cnt>n) 表示已经涂完了前 (n) 个点,则方案数 (ans+1)

    3、设计

    void dfs(int cnt)
    {
        if(cnt>n){
            for(int i=1;i<=n;i++){
                printf("%d%c",color[i]," 
    "[i==n]);
            }
            ans++;
            return;
        }
        for(int i=1;i<=m;i++){
            color[cnt]=i;
            int k=1;
            for(int j=1;j<=n;j++){
                if(graph[cnt][j]&&color[j]==color[cnt]){
                    k=0;
                    break;
                }
            }
            if(k){
                dfs(cnt+1);
            }
            color[cnt]=0;
        }
    }
    

    4、分析

    考虑这棵搜索树的大小,大小为 (1+m+m^2+m^3+....m^n),那么最坏的情况就是 (2m^n)个节点,其中每个节点还要和与其相连的节点比较,最坏时间复杂度 (O(2m^n imes n)=O(nm^n))

    5、源码

    https://github.com/HaHe-a/Algorithm-analysis-and-design-code/blob/master/m-color.cpp

    越自律,越自由
  • 相关阅读:
    java笔记之连接数据库
    关于数据集合的使用
    ubuntu下安装MySql
    Android笔记之Broadcast广播机制
    InputStream
    Android笔记之Toast
    jqGrid 复选框实现单选
    layer弹出框包含页面
    input不显示边框
    UUID
  • 原文地址:https://www.cnblogs.com/ha-chuochuo/p/14832594.html
Copyright © 2011-2022 走看看