首页 > 其他分享 >回溯法解决图着色问题

回溯法解决图着色问题

时间:2023-05-01 22:14:45浏览次数:38  
标签:颜色 个点 int sum dfs 着色 color 回溯 解决

 

#include<iostream>
using namespace std;
int G[50][50];   //保存无向图
int color[50];   //存放每个点的颜色 
int sum = 0;   //需要的颜色总数 
int mins = 999999;   //需要的最少的颜色数
int N;   //点的总个数 
//检查点第i+1个点是否能放颜色c
bool check(int i, int c) {
    bool flag = true;
    for (int j = 0; j < i; j++) {
        if (G[j][i] == 1) {  //前面与第i+1个点直接相连的点 
            if (color[j] == c)   //相连的点有颜色c 
                flag = false;
        }
    }
    return flag;
}
//问题求解 
void dfs(int i) {
    if (i > N - 1) {   //递归出口 
        if (sum < mins)
            mins = sum;   //记录最小颜色数 
        return; //有没有这句都一样,因为函数会自动返回(执行完函数体所有语句就返回)
    }
    else {
        //对第i+1个结点,尝试已使用的所有颜色
        int findColor = 0;  //标记能否在已有颜色中找到可以使用的颜色 
        for (int j = 0; j < sum; j++) {
            if (check(i, color[j])) {  //如果颜色冲突,直接执行下一次for循环,不做任何操作(剪枝)
                findColor = 1;  //只要已有的颜色中有不冲突的,findColor就会被置为1
                int sum1 = sum;  //sum1是一个临时变量,记录了这次递归的颜色总数
                color[i] = color[j];   //第i+1个点和第j+1个点颜色相同 
                dfs(i + 1);        //在这个颜色满足条件的情况下,记录好这个颜色,然后求下一个点的颜色 
                sum = sum1;   //回溯,(执行下一次for循环时,颜色总数应该不变,所以要回置颜色数)
            }
        }
        if (findColor == 0) {   //已有的颜色都不能用,已经走完了所有的颜色,所以不用回溯,而是去求下一个顶点的颜色
            sum++;   //总颜色数加一 
            color[i] = sum;
            dfs(i + 1);   //求下一个点的颜色 
        }
    }
}
int main() {
    cout << "请输入点的总个数" << endl;
    cin >> N;
    cout << "请输入二维矩阵表示的边的连接情况(1表示有边相连,0表示没有边相连)" << endl;
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            cin >> G[i][j];
        }
    }
    dfs(0);
    cout << "最少颜色数: " << mins << endl;
    system("pause");
}
/*
* 
0 1 1 0 0
1 0 1 1 1
1 1 0 0 1
0 1 0 0 1
0 1 1 1 0
*/

 

标签:颜色,个点,int,sum,dfs,着色,color,回溯,解决
From: https://www.cnblogs.com/Jocelynn/p/17367080.html

相关文章

  • 回溯法解决01背包问题
    #include<iostream>usingnamespacestd;structthing{intweight;//物品重量intvalue;//物品价值intnumber;//物品数量};thingthings[10];//假设最多有10个物品intthingsCount;//物品数量intbagSize;//背包容量intmaxTotalValue;//最大总重量......
  • 回溯法解n皇后问题
    #include<iostream>usingnamespacestd;#defineMAX21intarr[MAX];//arr[i]=k,表示在第i行的第k个位置放置一个皇后intsum;//计数解的个数intn;//记录几行几列boolcmp(introw,intcol){//当前行和列for(inti=1;i<row;i++){if(col==ar......
  • 回溯法解工作分配问题
    #include<iostream>usingnamespacestd;inta[100][100],sum=0,minn=2147483647,i,j,n;intb[100];voiddfs(intdep){intr;for(r=1;r<=n;++r)//dep表示第几个人,r表示工作if(!b[r])//如果第r件工作没有被选择{......
  • 当和别人产生不好解决的矛盾时,应该怎么办?
    当矛盾实在无法解决时,可以想办法激化矛盾,将矛盾的利益受损群体扩大(类似于转移矛盾),让更多人和自己站在同一阵营,当矛盾触及别人利益时,自会有人出手帮你解决矛盾。需要注意的是:1.不要形成需要别人二选一的局面,避免引火烧身。然而,矛盾双方是相辅相成的,事实上,解决矛盾任何一方都能是......
  • keil中error: #5: cannot open source input file “xxxxx“: No such file or direct
    error:#5:cannotopensourceinputfile“xxx.h“:Nosuchfileordirectory一般是.h没有添加到项目中。将包含.h文件或文件夹添加进去即可 ......
  • Vmware虚拟机开机就蓝屏解决办法
    概要在升级到了Windows1021H1之后,Vmware开启虚拟机电源的瞬间一定会蓝屏,虽然没有试过vituralBox之类的,但是应该情况一样。解决办法解决办法其实很简单,首先打开控制面板,找到卸载程序,然后点击左侧的“启用或关闭Windows功能”,找到最下面的“虚拟机平台”,勾选重启后即可。......
  • Vue解决代码重用页面不重新渲染问题
      1打开views->component->layout->AppMain.vue2 修改这两个地方OK 3 大功告成了!  key意思是计算属性(判断是否已经有值,没有的话那就赋值,有的话让key更新为当前属性) ......
  • android5.0使用Notification报RemoteServiceException的解决办法
    有时android5.0下使用Notification会报如下错误信息(比如开启重启动系统就要发送通知)android.app.RemoteServiceException:Badnotificationpostedfrompackage*:Couldn'tcreateicon:StatusBarIcon这个问题多数集中在setSmallIcon(R.drawable.scan......
  • Android 方法引用数超过 65535 优雅解决
    随着应用不断迭代更新,业务线的扩展,应用越来越大(比如:集成了各种第三方SDK或者公共开源的Library文件、jar文件)这样一来,项目耦合性就很高,重复作用的类就越来越多了,SO:问题就来了。相信大家在做自己公司项目时,都有机会遇到下面的错误:UNEXPECTEDTOP-LEVELEXC......
  • 启动Tomcat报WEB-INF\lib\j2ee.jar jar not loaded异常的解决办法
    今天加载工程时突然发现Tomcat报:2010-7-112:11:38org.apache.catalina.loader.WebappClassLoadervalidateJarFile信息:validateJarFile(C:\ProgramFiles\ApacheSoftwareFoundation\Tomcat6.0\webapps\accountant\WEB-INF\lib\j2ee.jar)-jarnotl......