染色问题的算法(转)

#include<iostream>
#define NUM 5
using namespace  std; 

bool ok(int i,int b[],int a[NUM][NUM])
{
for(int j=0;j<i;j++)
  if(a[i][j]==1&&b[i]==b[j])
      return false;
return true;
}
void backtrackcoloring(int i,int vertexnum,int &sum,int a[NUM][NUM])
{
    int n=vertexnum;
    int *b=new int[n];
    if(i>n)
        sum++;
    else
    {
        for(int j=0;j<4;j++)
        {    b[i]=j;
           if(ok(i,b,a))
               backtrackcoloring(i+1,vertexnum,&sum,a);
        }
    }
}
int main()
{
    int sum=0;
    int m,n;
    int a[NUM][NUM];
    int linenum=8;
    int vertexnum=5;
    for(int i=0;i<NUM;i++)
        for(int j=0;j<NUM;j++)
        {
            a[i][j]=0;
            a[j][i]=0;
        }
    for(i=0;i<8;i++)
    {
        cin>>m>>n;
        a[m][n]=1;
        a[n][m]=1;
    }
    backtrackcoloring(0,vertexnum,&sum,a);
    cout<<sum<<endl;
    return 0;
}

枚举遍历法...还以为是基于dfs遍历的

ps:手机编辑,排版不好...

原文:http://m.blog.csdn.net/article/details?id=26163067

下面的这个与上面的思路一样,代码是非递规的,虽然代码比较锉,可以看看作为参考。

链接:http://m.blog.csdn.net/article/details?id=17641017

时间: 2024-12-15 01:50:59

染色问题的算法(转)的相关文章

关于图的顶点染色问题的各种算法的C++实现之初探(一)——引言与简介

我是一个数学工作者,专业方向是图论.研究图论已经十年有余.一个月前,一个偶然的机会让我萌生了一个念头,那就是我想尝试用C++写出我所学过的图论方面的算法.作为一个数学工作者,过去一直是纸上谈兵,我之前并没有真正写过多少程序.确实,只知道写证明的纯理论的数学工作者往往自视甚高地看不起工程中实际写程序的程序员(即使程序员圈子里也有不少厉害的数学工作者),另一个方向的鄙视链好像也一定程度上存在着.于是,我不想只作一个"思想上的巨人行动上的矮子",便有了这个系列的博客. 首先声明,我不是专业的

常用/常考算法总结

转自tangjz的博客... 基础算法 模拟 搜索 广度优先搜索(BFS) 优化:双向BFS 深度优先搜索(DFS) 优化:折半DFS 迭代加深搜索(IDS) 启发式搜索(Astar) 优化:IDAstar 优化:剪枝.位运算 排序 冒泡排序/选择排序 基数排序/桶排序 计数排序 插入排序/希尔排序 快速排序 归并排序/求逆序对数 堆排序 贪心 分治 二分/三分/n分 cdq分治 倍增/ST 离散化 二分答案 快速幂/十进制快速幂 基础数学 数列求和 泰勒展开 矩阵 矩阵乘法 高斯消元 判断线性

CODEVS1022 覆盖 (二分图染色+匈牙利算法)

先对整幅图进行二分图染色,再跑一遍匈牙利算法. 1 /* CODEVS1022 */ 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <cmath> 6 7 #define maxn 10008 8 9 struct edge{ 10 int u,v,next; 11 }eg[maxn*4]; 12 13 int dx[4]={0,0,1,-1}; 14 i

BZOJ1443 游戏game (二分图染色+匈牙利算法)

先对整幅图进行二分图染色,再跑一遍匈牙利算法.如果最大匹配数=点数*2,那么输出WIN. 对于任何一个非必须在最大匹配上的点,即为所求的点. 1 Program Test375num2; 2 type arr=record 3 u,v,next:longint; 4 end; 5 const dx:array[1..4] of longint=(0,0,-1,1); 6 dy:array[1..4] of longint=(1,-1,0,0); 7 maxn=100008; 8 maxm=max

【算法】栈在回溯法中的应用-地图四染色问题

"四染色"问题:用不多于四种颜色对地图着色,使相邻的区域不重色. 算法思想:从第一个区域开始染色,每一个区域依次用颜色1,2,3,4进行试探,如果当前所试探的颜色与周围区域都不同色,则用栈记录该区域色数,否则用下一色数继续试探:如果四种颜色都与相邻区域重色,那么需要退栈,修改栈顶色数,即更改上一区域的颜色继续试探. 数据结构: s[]栈的顺序存储,用于表示区域的染色 dist[][]地图邻接矩阵,0表示不邻接,1表示邻接,区域与它自己表示为不邻接 以六区域为例: /** * 地图四染色

【01染色法判断二分匹配+匈牙利算法求最大匹配】HDU The Accomodation of Students

http://acm.hdu.edu.cn/showproblem.php?pid=2444 [DFS染色] 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<string> 5 #include<cmath> 6 #include<algorithm> 7 8 using namespace std; 9 const int maxn=2e2

BZOJ 1006 HNOI2008 奇妙的国度 弦图最小染色 MCS算法

题目大意:给定一个弦图,求最小染色 弦图相关问题,详细见陈丹琦09年讲稿<弦图与区间图> PPT里有一个问题没说清楚 就是MCS算法的O(m+n)怎么来的 那个在 http://tieba.baidu.com/p/2891159900 有jcvb神犇具体的解答 至于染色怎样标号,时间戳标记暴力硬扫就可以 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm>

BZOJ 1006 HNOI2008 神奇的国度 弦图最小染色 MCS算法

题目大意:给定一个弦图,求最小染色 弦图相关问题,具体见陈丹琦09年讲稿<弦图与区间图> PPT里有一个问题没说清楚 就是MCS算法的O(m+n)怎么来的 那个在 http://tieba.baidu.com/p/2891159900 有jcvb神犇详细的解答 至于染色如何标号,时间戳标记暴力硬扫即可 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm>

HDU1507 Uncle Tom&#39;s Inherited Land* 二分图匹配 匈牙利算法 黑白染色

原文链接http://www.cnblogs.com/zhouzhendong/p/8254062.html 题目传送门 - HDU1507 题意概括 有一个n*m的棋盘,有些点是废的. 现在让你用1*2的矩形覆盖所有的不废的点,并且不重叠,问最多可以覆盖多少个1*2的矩形,输出方案,有SPJ. 输入描述: 多组数据,每组首先两个数n,m(如果n和m为0,则结束程序) 然后给出k 然后给出k个二元组(x,y)表示废点的坐标. 题解 按照前两片博文的算法已经不行了,因为方案不对了. 所以我们要进行