首页 > 编程语言 > 详细

算法分析与设计(work12)

时间:2021-05-31 22:08:57      阅读:41      评论:0      收藏:0      [点我收藏+]

1、问题

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

2、解析

\(G\)\(n\) 个点,有 \(m\) 种颜色可以选择,那么可以转化为一棵深度为 \(n\)\(m\) 叉树。
使用回溯法来解决,首先将 \(cut=1\) 传入 \(dfs\),表示从第 \(1\) 个点开始涂色,涂的时候颜色从 \(1\sim 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]," \n"[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\times n)=O(nm^n)\)

5、源码

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

算法分析与设计(work12)

原文:https://www.cnblogs.com/ha-chuochuo/p/14832594.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!