問題描述:
圖的m着色問題。給定無向連通圖G和m種顏色,用這些顏色給圖的頂點着色,每個頂點一種顏色。如果要求G的每條邊的兩個頂點着不同顏色。給出所有可能的着色方案;如果不存在,則回答“NO”。
問題解析:
設無向圖的鄰接矩陣為,從1開始,Pi代表點i
0 1 1 1 0
1 0 1 1 1
1 1 0 1 0
1 1 1 0 1
0 1 0 1 0
這是解析點一取1的情況,其他的情況的繪制與此相似,都是有12種方案,故最后總方案數48,故不做贅述。
代碼設計:

// // main.cpp // 作業12 // // Created by yizhihenpidehou on 2020/5/26. // Copyright © 2020 yizhihenpidehou. All rights reserved. // #include <iostream> #include <stdio.h> int graph[100][100];//記錄無向圖 int color[100];//記錄顏色 int count; int n,m;;//點數,顏色數 int check(int num){//檢查每兩個點之間是否着色不同 for(int i=1;i<=num;i++){//檢查前個點與當前點的顏色是否沖突 if(graph[num][i]==1&&color[i]==color[num]){//兩點相連並且着色相同,則沖突 return 0; } } return 1; } void graphColor(int num){//着色 if(num==n+1){ for(int i=1;i<=num;++i){//輸出方案 printf("%d ",color[i]); } printf("\n"); count++; return ; } else{ for(int i=1;i<=m;i++){ color[num]=i;//先着色 if(check(num)){//測試當前顏色是否沖突 graphColor(num+1);//繼續向下着色 } color[num]=0;//回溯 } } } int main(int argc, const char * argv[]) { scanf("%d %d",&n,&m); for(int i=1;i<=n;i++){//輸入連通圖 for(int j=1;j<=n;j++){ scanf("%d",&graph[i][j]); } } printf("\n"); graphColor(1); if(count==0){//不存在方案 printf("NO\n"); } else{ printf("num:%d\n",count);//輸出方案數 } return 0; }
復雜度分析:
由於對每個點的着色要區分m種情況,並且根據該點的情況要對其他的點的着色進行檢測沖突以及考慮着色情況,若發生着色沖突,則回溯,故時間復雜度為O(mn²)