圖的m着色問題

圖的m着色問題

給定無向連通圖和m種不同的顏色。用這些顏色爲圖G的各頂點着色,每個頂點着一種顏色。是否有一種着色法使G中每條邊的兩個頂點有不同的顏色。這個問題是圖的m可着色判定問題。若一個圖最少需要m種顏色才能使圖中每條邊相連接的兩個頂點着不同顏色,稱這個數m爲這個圖的色數。求一個圖的色數m稱爲圖的m可着色優化問題。
給定一個圖以及m種顏色,請計算出塗色方案數。
這裏寫圖片描述

#include<stdio.h>

int m,n;
int count=0;
int color[100]={0};
int c[100][100];

bool ok(int k)  //判斷頂點k的着色是否發生衝突
{
    int i;
    for(i=1;i<k;i++)
        if(c[k][i]==1 && color[i]==color[k])
            return false;
        return true;
}

void backtrack(int t)
{
    int i,j;
    if(t>n)//求解完畢,輸出解
    {
        for(i=1;i<=n;i++)
            printf(" %d ",color[i]);
        count++;
        printf("\n\n");
    }
    else
    {
        for(j=1;j<=m;j++) //搜索m叉樹,每一個結點都有m中顏色可選
        {
            color[t]=j;     //爲第i個結點着色
            if(ok(t))   //檢查當前結點所着顏色沒有與前面的頂點衝突
                backtrack(t+1);     //爲下一個頂點着色
            color[t]=0;
        }
    }
}


int main()
{
    int i,j;

    printf("輸入頂點數n和着色數m:\n");
    scanf("%d %d",&n,&m);
    printf("輸入無向圖的鄰接矩陣:\n");
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            scanf("%d",&c[i][j]);

    printf("着色所有可能的解:\n");
    backtrack(1);
    printf("共有%d種解。\n",count);

    return 0;
}

/*
思路:
    首先建立該圖的鄰接矩陣,矩陣中,(x,y)值爲 1 代表 x , y 相鄰。然後進行着顏色,
    每次上色之後都要判斷 該頂點與該頂點相連的頂點的顏色是否衝突,若衝突,則重新選擇顏色填入,
    否則就 添加下一個點的顏色。
*/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章