码迷,mamicode.com
首页 > 其他好文 > 详细

着色问题

时间:2020-05-27 00:56:57      阅读:83      评论:0      收藏:0      [点我收藏+]

标签:span   存在   str   c++   scanf   方案   判断   its   描述   

描述

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

解析

(1)通过回溯的方法,不断的为每一个节点着色,在前面cur-1个节点都合法的着色之后,开始对第cur-1个节点进行着色,

(2)这时候枚举可用的m个颜色,通过和第cur-1个节点相邻的节点的颜色,来判断这个颜色是否合法

(3)如果找到那么一种颜色使得第cur-1个节点能够着色,那么说明m种颜色的方案在当前是可行的。

(4)cur每次迭代加1,如果cur增加到N并通过了检测,说明m种颜色是可满足的。

(5)注意,这里只是要求判断m种颜色是否可满足,所以找到任何一种方案就可以了。

代码

#include<bits/stdc++.h>
using namespace std;

int n,m; //n顶点数,m颜色数 
int graph[20][20];
int color[20];
int iRet = 0;

bool love(int zhb) {
    for(int hy = 1;hy<=n;hy++) {
        if(graph[hy][zhb] && color[zhb] == color[hy]) return true; 
    }
    return false;
}
void backtrack(int cur) {
    if(cur > n) {
        for(int i=1;i<=n;i++) {
            printf("%d ",color[i]);
        }
        iRet++;
        printf("\n");
    }
    else {
        
        for(int i=1;i<=m;i++) {
            color[cur] = i;
            if(!love(cur)) {
                backtrack(cur+1);
            }
            color[cur] = 0;
        }
    }
}
int main() {
    int a,b;
    scanf("%d%d",&n,&m);
    while(scanf("%d%d",&a,&b) != EOF) {
        graph[a][b] = 1;
        graph[b][a] = 1;
        if(a == 0 && b == 0) break;
    }
    backtrack(1);
    printf("-----------\n\n");
    printf("total:%d",iRet);
    return 0;
} 

 

着色问题

标签:span   存在   str   c++   scanf   方案   判断   its   描述   

原文地址:https://www.cnblogs.com/zhhhb/p/12969587.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!