图的着色问题-回溯法

问题描述:给定无向连通图G和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色。是否有一种着色法使G中每条边的2个顶点着不同颜色。这个问题是图的m可着色判定问题。若一个图最少需要m种颜色才能使图中每条边连接的2个顶点着不同颜色,则称这个数m为该图的色数。求一个图的色数m的问题称为图的m可着色优化问题。
输入:无向图,m
输出:如果能,则输出方案
 

算法:
t=1
    对当前的第t个顶点着色;
        如果t>n,则已经求得一组解,输出方案并返回;
        否则,依次对顶点t着色1--m;
            若t与所有相邻的顶点无颜色冲突,则继续为下一个顶点着色;
            否则,回溯,测试下一种颜色;

程序代码:

#include<stdio.h>
#include<string.h>
#define N 100
int map[N][N],color[N],n,m,count;//color数组用来记录n个顶点的着色情况 
int ok(int cur) {
    int i;
    for(i=1;i<cur;i++)
        if(map[cur][i]==1&&color[cur]==color[i]) return 0;
    return 1; 
}
void graphcolor(int cur) {
    int i;
    if(cur>n) {
        for(i=1;i<=n;i++)
            printf("%d ",color[i]);
        printf("\n");
        count++;
        return;
    }
    
    for(i=1;i<=m;i++) {
        color[cur]=i;
        if(ok(cur)==1)
            graphcolor(cur+1);
    }
}
int main() {
    int i,j,k,a,b;
    scanf("%d %d %d",&n,&k,&m);
    memset(map,0,sizeof(map));
    for(i=1;i<=k;i++){//初始化地图 
        scanf("%d %d",&a,&b);
        map[a][b]=map[b][a]=1;
    }
    count=0;
    graphcolor(1);
    printf("%d\n",count); 
    system("pause");
    return 0;
}

/*
5 8 4
2 1
2 3
2 4
2 5
1 3
3 4
4 5
1 4
1 2 3 4 1
1 2 3 4 3
1 2 4 3 1
1 2 4 3 4
1 3 2 4 1
1 3 2 4 2
1 3 4 2 1
1 3 4 2 4
1 4 2 3 1
1 4 2 3 2
1 4 3 2 1
1 4 3 2 3
2 1 3 4 2
2 1 3 4 3
2 1 4 3 2
2 1 4 3 4
2 3 1 4 1
2 3 1 4 2
2 3 4 1 2
2 3 4 1 4
2 4 1 3 1
2 4 1 3 2
2 4 3 1 2
2 4 3 1 3
3 1 2 4 2
3 1 2 4 3
3 1 4 2 3
3 1 4 2 4
3 2 1 4 1
3 2 1 4 3
3 2 4 1 3
3 2 4 1 4
3 4 1 2 1
3 4 1 2 3
3 4 2 1 2
3 4 2 1 3
4 1 2 3 2
4 1 2 3 4
4 1 3 2 3
4 1 3 2 4
4 2 1 3 1
4 2 1 3 4
4 2 3 1 3
4 2 3 1 4
4 3 1 2 1
4 3 1 2 4
4 3 2 1 2
4 3 2 1 4
48

*/


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值