圖的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 相鄰。然後進行着顏色,
每次上色之後都要判斷 該頂點與該頂點相連的頂點的顏色是否衝突,若衝突,則重新選擇顏色填入,
否則就 添加下一個點的顏色。
*/