图着色(回溯+剪枝)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ancientear/article/details/84800910

图着色,第一行输入三个数,n,m,k,n为顶点数,m为颜色数,k为边数,n为行数,i到j有边,n小于等于20,输出各点颜色号,一行输出,空格分割,没有就输出NO

#include<cstdio>
#include<algorithm>
using namespace std;
int m,n,k;
int map[105][105];
int color[105];
int ans;
//对于每个点,枚举它可能被染的颜色。如果与它相连的点颜色和它相同,那么就换下一个颜色;如果哪个颜色也不能选,那就回到上一个点换颜色(回溯),当确定完最后一个点的颜色后,这就是一个可行解,将答案增加1。
void a(int p)
{
//遍历图上任意点,因为没有确定编号n以后的点的颜色。所以到n-1就相对于把点全遍历一遍
    if(p == n+1)
    {
        ans++;
        return;
    }
    else
    {
        for(int i=1;i<=m;i++)
        {
            int boo = false;
            for(int j=1;j<=p;j++)
            {
                if(map[p][j] == 1 && color[j] == i)
                {
                    boo = true;
                    break;
                }
            }
            if(boo == true) continue;
            color[p] = i;
            a(p+1);
            color[p] = 0;
        }
    }
}
int main()
{
    scanf("%d%d%d",&n,&k,&m);
    for(int i=1;i<=k;i++)
    {
        int d1,d2;
        scanf("%d%d",&d1,&d2);
        map[d1][d2] = 1;
        map[d2][d1] = 1;
    }
    a(1);
    if(ans != 0)
    printf("%d",ans);
    else
        printf("NO");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/ancientear/article/details/84800910
今日推荐