• 贪心算法求解 图的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. }  

  • 相关阅读:
    Android 获取系统编解码器
    文心一言 VS 讯飞星火 VS chatgpt (183)-- 算法导论13.4 7题
    论文阅读之《Quasi-Unsupervised Color Constancy 》
    数据库配置口令复杂度策略和口令有效期策略
    threejs(6)-操控物体实现家居编辑器
    C语言scanf_s函数的使用
    JDBC-04:PreparedStatement针对不同表的通用查询操作
    15:00面试,15:08就出来了,问的问题有点变态。。。
    【SpringBoot笔记20】SpringBoot跨域问题之CORS的四种解决方案
    【Pytorch深度学习实战】(7)深度残差网络(DRN)
  • 原文地址:https://blog.csdn.net/apple_51426592/article/details/128176275