• 贪心算法求解 图的m着色问题


    图的m色判定问题: 给定无向连通图Gm种颜色。用这些颜色为图G的各顶点着色.问是否存在着色方法,使得G中任2邻接点有不同颜色。

    图的m色优化问题:给定无向连通图G,为图G的各顶点着色, 使图中任2邻接点着不同颜色,问最少需要几种颜色。所需的最少颜色的数目m称为该图的色数。

    若图G是可平面图,则它的色数不超过4色(4色定理).

    4色定理的应用:在一个平面或球面上的任何地图能够只用4种

    颜色来着色使得相邻的国家在地图上着有不同颜色

    任意图的着色

    Welch Powell

    a).将G的结点按照度数递减的次序排列.

    b).用第一种颜色对第一个结点着色,并按照结点排列的次序 

       对与前面着色点不邻接的每一点着以相同颜色.

    c).用第二种颜色对尚未着色的点重复步骤b).用第三种颜色

       继续这种作法, 直到所有点着色完为止.

    [cpp] view plaincopy

    1. #include   
    2. #include   
    3. #include   
    4. #include   
    5. using namespacestd;  
    6.    
    7. int map[10][10];//邻接矩阵  
    8.    
    9. typedef structNode{ //定义节点结构体  
    10.    int index; //编号  
    11.    int degree; //度  
    12.    int color; //改节点的颜色  
    13. } Node;  
    14.    
    15. Nodenodes[10];  
    16.    
    17. bool com(Nodenode1,Nodenode2) { //按度从高到低排序  
    18.    return node1.degree > node2.degree;  
    19. }  
    20.    
    21. bool com2(Nodenode1,Nodenode2) { //按度从高到低排序  
    22.    return node1.index < node2.index;  
    23. }  
    24.    
    25. int main() {  
    26.    ifstream read;  
    27.    read.open("map.data");//map.data是存放数据的文件名  
    28.    int m, n;  
    29.    while (read >> m>> n) {  
    30.       for (int i = 0; i < m; i++) {//读入数据  
    31.          int degree = 0;  
    32.          for (int j = 0; j < n; j++) {  
    33.             read>> map[i][j];  
    34.             if (map[i][j])  
    35.                 degree++;  
    36.          }  
    37.          nodes[i].index = i;  
    38.          nodes[i].degree = degree;  
    39.          nodes[i].color = 0;  
    40.       }  
    41.    
    42.       //排序  
    43.       sort(nodes,nodes + m, com);  
    44.       int k = 0;//K 代表第几种颜色  
    45.       while (true) {  
    46.          k++;  
    47.          int i;  
    48.          for (i = 0; i < m; i++){//先找到第一个未着色的节点  
    49.             if (nodes[i].color == 0) {  
    50.                 nodes[i].color = k;  
    51.                 break;  
    52.             }  
    53.          }  
    54.          if (i == m)//循环退出的条件,所有节点都已着色  
    55.             break;  
    56.          //再把所有不和该节点相邻的节点着相同的颜色  
    57.          for(int j=0; j
    58.             if(nodes[j].color ==0 &&map[nodes[i].index][nodes[j].index] == 0  
    59.                    &&i!=j)  
    60.                 nodes[j].color = k;  
    61.          }  
    62.       }  
    63.    
    64.       //输出结果:  
    65.       sort(nodes,nodes + m, com2);  
    66.     cout << "共需要" << k-1 << "种颜色" << endl;  
    67.       for (int i = 0; i < m; i++)  
    68.          cout<< "节点:"<
    69.       return 0;  
    70.    }  
    71. }  

  • 相关阅读:
    代理IP与Socks5代理在多领域的卓越应用
    React Native将 ipad 端软件设置为横屏显示后关闭 Modal 弹窗报错
    【无标题】接口测试用例设计(精华)
    快速排序(java语言实现)
    [附源码]Python计算机毕业设计Django基于Web的软考题库平台
    一个简单的mini strace工具以及strace原理
    面试真的被问麻了......
    Django实战项目-学习任务系统-自定义URL拦截器
    Redis -- 基础知识1
    Python+Django前后端分离
  • 原文地址:https://blog.csdn.net/apple_51426592/article/details/128176275