圖的m-着色判定問題——給定無向連通圖G和m種不同的顏色。用這些顏色為圖G的各頂點着色,每個頂點着一種顏色,是否有一種着色法使G中任意相鄰的2個頂點着不同顏色?
圖的m-着色優化問題——若一個圖最少需要m種顏色才能使圖中任意相鄰的2個頂點着不同顏色,則稱這個數m為該圖的色數。求一個圖的最小色數m的問題稱為m-着色優化問題。
解題思路:使用回溯法,具體步驟是將cur=1傳入backtrack(),即從第一個開始塗色。
塗的時候從顏色1開始到m,每當塗上一個色,要用ok(cur)判斷第cur個點是否可以塗這個色,不可以的話就不再往下塗了,改試另一個顏色,可以的話就繼續。
當cur>n的時候即前n個點都塗完了,然后輸出結果並cou++計數。
#include <iostream> #include <cstdio> using namespace std; int n,m; int a=1,b=1; int cou=0; int graph[20][20]={0}; int color[20]={0}; bool ok(int c){ for(int k=1;k<=n;k++){ if(graph[c][k]&&color[c]==color[k]){ return false; } } return true; } void backtrack(int cur){ if(cur>n){ for(int i=1;i<=n;i++){ printf("%d ",color[i]); } cou++; printf("\n"); }else{ for(int i=1;i<=m;i++){ color[cur]=i; if(ok(cur)){ backtrack(cur+1); } color[cur]=0; } } } int main() { scanf("%d %d",&n,&m); while(scanf("%d %d",&a,&b)!=EOF&&a!=0&&b!=0){ graph[a][b]=1; graph[b][a]=1; } backtrack(1); printf("Total=%d",cou); return 0; }