zoukankan      html  css  js  c++  java
  • 回溯法之地图着色

    //program 5-3
    #include <iostream>
    #include <string.h>
    #define MX 50
    using namespace std;
    
    int x[MX];         //解分量
    int map[MX][MX];  //图的邻接矩阵
    int sum=0;   //记录解的个数
    int n,m,edge;  //节点数和颜色数
    
    //创建邻接矩阵
    void CreatMap()
    {
        int u,v;
        cout << "请输入边数:";
        cin >> edge;
        memset(map,0,sizeof(map));//邻接矩阵里面的数据初始化为0,meset需要引入#include <string.h>
        cout << "请依次输入有边相连的两个结点u和v,用空格分开:";
        for(int i=1;i<=edge;i++)
        {
            cin>>u>>v;
            map[u][v]=map[v][u]=1;
        }
    }
    //约束条件
    bool OK(int t)
    {
        for(int j=1;j<t;j++)
        {
            if(map[t][j])      //如果t与j邻接
            {
                if(x[j]==x[t]) //判断t与j的着色号是否相同
                    return false;
            }
        }
        return true;
    }
    //搜索函数
    void Backtrack(int t)
    {
    
        if(t>n) //到达叶子,找到一个着色方案
        {
            sum++;
            cout<<""<<sum<<"种方案:";
            for(int i=1;i<=n;i++) //输出该着色方案
                cout<<x[i]<<" ";
            cout<<endl;
        }
        else{
            for(int i=1;i<=m;i++) //每个结点尝试m种颜色
            {
                x[t]=i;
                if(OK(t))
                    Backtrack(t+1);
            }
        }
    }
    int main()
    {
        cout<<"输入节点数: ";
        cin>>n;
        cout<<"输入颜色数: ";
        cin>>m;
        cout<<"输入无向图的邻接矩阵:"<<endl;
        CreatMap();
        Backtrack(1);
    }
    无欲则刚 关心则乱
  • 相关阅读:
    Kubernetes 再深入一点点
    10分钟完成 mongodb replSet 部署
    网络篇
    p2p 打洞专场(转)
    Dockerfile 编写
    关于github 代码管理,协作开发
    Kubernetes 基于 ubuntu18.04 手工部署 (k8s)
    备忘 ubuntu ip 及 dns 的坑
    各种语言web性能简单对比测试
    vue 按需加载
  • 原文地址:https://www.cnblogs.com/xjyxp/p/11332517.html
Copyright © 2011-2022 走看看