图的色数问题整理(未完待续......)

最近离散在讲图的色数问题,顺便做了几道题。前面两道题代码主要参考刘汝佳的紫书的dp。后面一题为cf上的求三个链节点的图的色数(前面只是两个相邻节点),用dfs或者bfs遍历全图实现。具体下面分析。

先是poj的1129,可以说是两个邻接点的图的色数的裸题。数组讲道理应该开到1<<26那么大,但是会mle,后来本着试一试的态度把它改成了1<<20竟然过了。。。只能说数据有点水,或者实际上计算机只能处理到20位这么多??这道题另一个思路是用四色定理,也是网上大部分的解题思路,回头研究一下。

代码:

#include
#include
#include
#include
#include
#define INF 0x3f3f3f3f
using namespace std;
const int maxn=100;
const int maxs=1<<20;
char s[maxn],st,g;
int n,d[maxs],nums[maxn],cnt;

bool no_edge_inside(int id,vector edge[]){
    for(int i=1;i<=n;i++)
    if(id&(1<<(i-1))){///找到id内的所有子集
        for(int j=0;j si;
    for(int i=1;i<=n;i++)
        if(s0&(1<<(i-1)))
        si.push_back(i);//把子集的点先存入si中
    for(int i=0;i edge[]){
    d[0]=0;
    for(int S=1;S<(1< edge[maxn];
        memset(nums,0,sizeof(nums));
        memset(d,0,sizeof(d));
        memset(s,0,sizeof(s));
        cnt=0;
        if(n==0)
            break;
        for(int i=1;i<=n;i++){
            scanf("%s",s);
            if(nums[s[0]]==0)
                nums[s[0]]=++cnt;
            int c=nums[s[0]];///对应字母的编号
            for(int i=2;i

CodeForces - 782C

题目给你一个无环图,问至少要用多少种颜色涂这个图,使得同一链节上的三个相邻的节点颜色不同。这道题是不能用上面的思路解决的。主要是三个节点两两间没有边相连,不一定就可以涂上相同的颜色。只能用搜索解决。然后这里面有个取巧的地方在于最多的颜色为max(点的度数)+1;然后只需要设置一个数组color来记录当前节点颜色与父亲节点,爷爷节点,以及同父母兄弟节点不同不同就可以了。

dfs

#include
#include
#include
#include
#include
using namespace std;
const int maxn=3e5+50;//太大,cb上运行会报错。。。
int n,st,ed,c,fcolor[maxn],color[maxn],deg,no;

void dfs(int f,int u,int c1,int c2,vector v[]){///f:当前点的父节点编号,u当前点编号,c1:color[f],c2:color[u]
    int cc=1;///cc记录为即将访问点的颜色编号
    for(int i=0;i v[maxn];
       memset(color,0,sizeof(color));
       deg=0;
       c=2;
       for(int i=0;i
bfs:

思路基本上上面一样,不同的是要多设置fa,fcolor数组记录节点的父亲编号和父亲的颜色。

#include
#include
#include
#include
#include
using namespace std;
const int maxn=2e5+50;
int color[maxn],fcolor[maxn],n,st,ed,fa[maxn],cc,deg;

void bfs(int st,vector v[]){
    queue q;
    color[st]=1;
    fa[st]=fcolor[st]=-1;

    q.push(st);
    while(!q.empty()){
        int no=q.front();
            q.pop();
            cc=1;
            for(int i=0;i v[maxn];
       memset(color,0,sizeof(color));
       memset(fcolor,0,sizeof(fcolor));
       memset(fa,0,sizeof(fa));
       deg=0;
       for(int i=0;i


效率上二者实现差不多,dfs时间快一点(因为是尾递归),但bfs占用的内存小一点



你可能感兴趣的:(bfs,dfs,图的色数)