着色问题

Posted zhhhb

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了着色问题相关的知识,希望对你有一定的参考价值。

描述

图的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("
");
    }
    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("-----------

");
    printf("total:%d",iRet);
    return 0;
} 

 

以上是关于着色问题的主要内容,如果未能解决你的问题,请参考以下文章

如何在片段着色器中平铺部分纹理

为啥保守光栅化无法为某些三角形调用片段着色器?

GLSL-片段着色器不同部分的精度不同

在片段着色器中丢失纹理定义

OpenGL片段着色器不照亮场景

如何在片段着色器中进行自定义模板测试