首页 > 其他 > 详细

图的M着色问题

时间:2017-03-05 20:29:19      阅读:246      评论:0      收藏:0      [点我收藏+]

图的m-着色判定问题——给定无向连通图G和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色,是否有一种着色法使G中任意相邻的2个顶点着不同颜色?

图的m-着色优化问题——若一个图最少需要m种颜色才能使图中任意相邻的2个顶点着不同颜色,则称这个数m为该图的色数。求一个图的最小色数m的问题称为m-着色优化问题。技术分享

 

解题思路:使用回溯法,具体步骤是将cur=1传入backtrack(),即从第一个开始涂色。

  涂的时候从颜色1开始到m,每当涂上一个色,要用ok(cur)判断第cur个点是否可以涂这个色,不可以的话就不再往下涂了,改试另一个颜色,可以的话就继续。

    当cur>n的时候即前n个点都涂完了,然后输出结果并cou++计数。

#include <iostream>
#include <cstdio>

using namespace std;

int n,m;
int a=1,b=1;
int cou=0;
int graph[20][20]={0};
int color[20]={0};

bool ok(int c){
    for(int k=1;k<=n;k++){
        if(graph[c][k]&&color[c]==color[k]){
            return false;
        }
    }
    return true;
}

void backtrack(int cur){
    if(cur>n){
        for(int i=1;i<=n;i++){
            printf("%d ",color[i]);
        }
        cou++;
        printf("\n");
    }else{
        for(int i=1;i<=m;i++){
            color[cur]=i;
            if(ok(cur)){
                backtrack(cur+1);
            }
            color[cur]=0;
        }
    }
}

int main()
{
    scanf("%d %d",&n,&m);
    while(scanf("%d %d",&a,&b)!=EOF&&a!=0&&b!=0){
        graph[a][b]=1;
        graph[b][a]=1;
    }
    backtrack(1);
    printf("Total=%d",cou);
    return 0;
}

 

图的M着色问题

原文:http://www.cnblogs.com/Bennetts/p/6506483.html

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