图的m着色问题

#include <stdio.h>
#include <string.h>
#include <algorithm>
#define NUM 110

using namespace std;

int n;  ///图的顶点数
int m;  ///可用的颜色数量
int c[NUM][NUM];    ///图的邻接矩阵
int x[NUM];         ///当前的解向量
int sum;    ///总方案数目
int match;

bool Same(int t)
{
    int i;
    for(i=1; i<=n; i++)
        if(c[t][i]==1&&x[i]==x[t])
            return false;
    return true;
}

///形参t是回溯的深度,从1开始
void BackTrack(int t)
{
    int i;
    if(t>n)
    {
        sum++;
        for(i=1; i<=n; i++)
            printf("%d ",x[i]);
        printf("\n");
    }
    else
    {
        ///搜索当前扩展节点的m个孩子
        for(i=1; i<=m; i++)
        {
            x[t] = i;
            if(Same(t)) BackTrack(t+1);
            x[t] = 0;
        }
    }
}

int main()
{
    m=4;
    int Cases;
    scanf("%d",&Cases);
    while(Cases--)
    {
        sum=0;
        for(int i=0;i<NUM;i++)
            for(int j=0;j<NUM;j++)
                c[i][j] = 0;

        scanf("%d%d",&n,&match);
        for(int i=1; i<=match; i++)
        {
            int father,brother;
            scanf("%d%d",&father,&brother);
            c[father][brother]=c[brother][father]=1;
        }
        BackTrack(1);
        printf("%d\n",sum);
    }
    return 0;
}

时间: 2024-12-06 20:14:41

图的m着色问题的相关文章

算法java实现--回溯法--图的m着色问题

(转自:http://blog.csdn.net/lican19911221/article/details/26264471) 图的m着色问题的Java实现(回溯法) 具体问题描述以及C/C++实现参见网址 http://blog.csdn.NET/lican19911221/article/details/26228345 /** * 着色问题 * @author Lican * */ public class Coloring { int n;//图的顶点数 int m;//可用颜色数 i

P2819 图的m着色问题

题目背景 给定无向连通图G和m种不同的颜色.用这些颜色为图G的各顶点着色,每个顶点着一种颜色.如果有一种着色法使G中每条边的2个顶点着不同颜色,则称这个图是m可着色的.图的m着色问题是对于给定图G和m种颜色,找出所有不同的着色法. 题目描述 对于给定的无向连通图G和m种不同的颜色,编程计算图的所有不同的着色法. 输入输出格式 输入格式: 第1行有3个正整数n,k 和m,表示给定的图G有n个顶点和k条边,m种颜色.顶点编号为1,2,…,n.接下来的k行中,每行有2个正整数u,v,表示图G 的一条边

图的m着色问题 (回溯搜索)

图的m着色问题 [问题描述] 给定无向连通图G和m种不同的颜色.用这些颜色为图G的各顶点着色,每个顶点着一种颜色.如果有一种着色法使G中每条边的2个顶点着不同颜色,则称这个图是m可着色的.图的m着色问题是对于给定图G和m种颜色,找出所有不同的着色法. [编程任务] 对于给定的无向连通图G和m种不同的颜色,编程计算图的所有不同的着色法. [输入格式] 文件color.in输入数据.第1行有3个正整数n,k 和m,表示给定的图G有n个顶点和k条边,m种颜色.顶点编号为1,2,-,n.接下来的k行中,

洛谷 P2819 图的m着色问题

P2819 图的m着色问题 题目背景 给定无向连通图G和m种不同的颜色.用这些颜色为图G的各顶点着色,每个顶点着一种颜色.如果有一种着色法使G中每条边的2个顶点着不同颜色,则称这个图是m可着色的.图的m着色问题是对于给定图G和m种颜色,找出所有不同的着色法. 题目描述 对于给定的无向连通图G和m种不同的颜色,编程计算图的所有不同的着色法. 输入输出格式 输入格式: 第1行有3个正整数n,k 和m,表示给定的图G有n个顶点和k条边,m种颜色.顶点编号为1,2,…,n.接下来的k行中,每行有2个正整

回溯法--图的m着色问题 C语言

使用编译器 CodeBlock17.12 算法实验课根据课本Java代码写的C语言代码 #include "stdio.h"int n,m;//顶点数,可用颜色数int a[100][100];//图的邻接矩阵int x[100];//当前解int sum=0;//找到的找色方案void input(){    printf("输入顶点数n和着色数m:\n");    scanf("%d %d",&n,&m);    printf

P2819 图的m着色问题(DFS)

思路:最开始的回溯顺序是正常的图遍历的回溯顺序,其实也没有错.但是,因为怎么调都不对,看了题解.下面,请结合题解思路和代码一起感受一下回溯顺序的改变,算法的改变和代码在哪里实现了这种顺序. 回溯顺序:按照节点的索引大小顺序. 实现分步:DFS函数, check判断函数 一,DFS函数部分,确定了整个回溯的顺序吧.因为毕竟是一个点一个点按大小顺序进行深入的.对该层的点x上色,通过check()判断与比它小的相邻点颜色不同就进入下一层,否则从新改变颜色. 二,check()部分, (这是代码的核心)

图论---图的m-点着色判定问题(深搜--迭代式)

转自 图的m着色问题 图的m-着色判定问题--给定无向连通图G和m种不同的颜色.用这些颜色为图G的各顶点着色,每个顶点着一种颜色,是否有一种着色法使G中任意相邻的2个顶点着不同颜色? 图的m-着色优化问题--若一个图最少需要m种颜色才能使图中任意相邻的2个顶点着不同颜色,则称这个数m为该图的色数.求一个图的最小色数m的问题称为m-着色优化问题. 算法描述(迭代算法) color[n]存储n个顶点的着色方案,可以选择的颜色为1到m t=1->n 对当前第t个顶点开始着色:(DFS) if: t>

个人总结-----非贪心算法的图的m着色判断及优化问题

1.问题描述: 对于著名的图的m着色,有两个主要的问题,一个是图的m色判定问题,一个是图的m色优化问题,描述如下. 图的m色判定问题: 给定无向连通图G和m种颜色.用这些颜色为图G的各顶点着色.问是否存在着色方法,使得G中任2邻接点有不同颜色. 图的m色优化问题:给定无向连通图G,为图G的各顶点着色, 使图中任2邻接点着不同颜色,问最少需要几种颜色.所需的最少颜色的数目m称为该图的色数. 对于网上或书上的一些求解方式主要用贪心算法求解的方式,也有用回溯法的方式(一般不用,时空太大).如这位博主 

回溯法 -数据结构与算法

1.回溯法算法思想: 定义: 回溯法(探索与回溯法)是一种选优搜索法,按选优条件向前搜索,以达到目标.但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”. 1.回溯法适用:有许多问题,当需要找出它的解集(全部解)或者要求回答什么解是满足某些约束条件的最优解时,往往要使用回溯法. 2.有组织的穷举式搜索:回溯法的基本做法是搜索或者有的组织穷尽搜索.它能避免搜索所有的可能性.即避免不必要的搜索.这种方