zoukankan      html  css  js  c++  java
  • 阿里-着色问题

    题目

    写出图着色问题程序:一个圆饼,被从中点画半径分成n等分,有k种颜色,每个区域不能和两边颜色相同.
    

    讨论

    • 这里有种递推公式的方法

    #include <iostream>
    #include <vector>
    #include <numeric>
    #include <limits>
    #include <math.h>
    
    
    
    //将一个圆形等分城N个小扇形,将这些扇形标记为1,2,3, …,N。现在使用M种颜色对每个扇形进行涂色,每个扇形涂一种颜色,且相邻的扇形颜色不同。
    //
    //求:有多少种涂色方法。
    //
    //
    //
    //备注:1,不考虑数值越界的情况。
    //
    //     2,N >= 1, M >= 3。
    //
    //     3,一个例子:如果N = 3,M = 3时,一共有6种涂法。
    
    
    //将圆分成m个扇形,有n种颜色,相邻扇形颜色不同
    //(1)不要求n种颜色全用上,求所有方法数?
    //(2)要求n种颜色全用上,求所有方法数?
    
    using namespace std;
    
    /** 请完成下面这个函数,实现题目要求的功能 **/
    /** 当然,你也可以不按照这个模板来作答,完全按照自己的想法来 ^-^  **/
    
    long long Colour(int colour_number, int split_part) {
    
    	long long ret = 0;
    	if (colour_number>=2)
    	{
    		ret = pow(colour_number - 1, split_part) + (colour_number - 1)*pow(-1, split_part);
    	}
    	
    	return ret;
    }
    
    
    int main() {
    
    
    	long long res;
    
    	int _colour_number;
    	cin >> _colour_number;
    	//cin.ignore(std::numeric_limits<std::streamsize>::max(), '
    ');
    
    
    	int _split_part;
    	cin >> _split_part;
    	//cin.ignore(std::numeric_limits<std::streamsize>::max(), '
    ');
    
    	res = Colour(_colour_number, _split_part);
    	//res = numWays(_split_part,_colour_number);   
    	cout << res << endl;
    
    
    	return 0;
    
    }
    
    
    给定无向连通图G和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色。是否有一种着色法使G中每条边的2个顶点着不同颜色。这个问题是图的m可着色判定问题。若一个图最少需要m种颜色才能使图中每条边连接的2个顶点着不同颜色,则称这个数m为该图的色数。求一个图的色数m的问题称为图的m可着色优化问题。
    输入:无向图,m
    输出:如果能,则输出方案
    
    • dfs和迭代法
    算法描述(迭代算法)
    
     color[n]存储n个顶点的着色方案,可以选择的颜色为1到m
    
    t=1->n
    对当前第t个顶点开始着色:
      if:   t>n  则已求得一个解,输出着色方案即可
        else:    依次对顶点t着色1-m,
         if:   t与所有其它相邻顶点无颜色冲突,则继续为下一顶点着色;
        else:     回溯,测试下一颜色。
    
    
    #include<iostream> 
    using namespace std;
    int color[100], sum;
    
    bool ok(int k, int c[100][100])
    {
    	for (int i = 1; i < k; i++)
    	if (c[k][i] == 1 && color[i] == color[k])
    		return false;
    
    	return true;
    }
    
    void backtrack(int k, int n, int m, int c[100][100])
    {
    	if (k > n){
    		for (int i = 1; i <= n; i++)
    			cout << color[i] << " ";
    		cout << endl;
    		sum++;
    	}
    	else
    	for (int i = 1; i <= m; i++){
    		color[k] = i;
    	    if (ok(k, c))
    		    backtrack(k + 1, n, m, c);
    		color[k] = 0;
    	}
    
    }
    
    int main()
    {
    	int i, j, n, m;
    	int c[100][100];
    	cout << "输入顶点数n和着色数m : 
    ";
    	cin >> n;
    	cin >> m;
    
    	cout << "输入无向图的邻接矩阵:
    ";
    	for (i = 1; i <= n; i++)
    	for (j = 1; j <= n; j++)
    		cin >> c[i][j];
    
    	cout << "着色所有可能的解:
    ";
    
    	backtrack(1, n, m, c);
    
    	cout << "着色可能解的总数为:" << sum << endl;
    	system("pause");
    	return 0;
    }
    
    
    
  • 相关阅读:
    CentOS安装JAVA后JAVA版本不对的问题
    AES加密时抛出 Illegal key size or default parameters
    Tomcat7 安装StartSSL证书笔记
    window无法启动mongodb服务:系统找不到指定的文件错误的解决方法
    springAop @AfterReturning注解 获取返回值
    springAop 使用@Around,@After等注解时,代码运行两边的问题
    htmlunit 导致高cup占用,一老内存溢出的解决办法
    spring activemq 整合
    springMVC整合Junit4进行单元测试
    socket,tcp,http三者之间的区别和原理
  • 原文地址:https://www.cnblogs.com/ranjiewen/p/8539095.html
Copyright © 2011-2022 走看看