1. 程式人生 > 其它 >圖的m著色點

圖的m著色點

題目背景

給定無向連通圖G和m種不同的顏色。用這些顏色為圖G的各頂點著色,每個頂點著一種顏色。如果有一種著色法使G中每條邊的2個頂點著不同顏色,則稱這個圖是m可著色的。圖的m著色問題是對於給定圖G和m種顏色,找出所有不同的著色法。

題目描述

對於給定的無向連通圖G和m種不同的顏色,程式設計計算圖的所有不同的著色法。

輸入格式

第1行有3個正整數n,k 和m,表示給定的圖G有n個頂點和k條邊,m種顏色。頂點編號為1,2,…,n。接下來的k行中,每行有2個正整數u,v,表示圖G 的一條邊(u,v)。

輸出格式

程式執行結束時,將計算出的不同的著色方案數輸出。

 1 #include<iostream>
 2
#include<cstring> 3 #include<cstdio> 4 using namespace std; 5 bool f[105][105];//存兩個點是否連通 6 int color[105];//存每個點的顏色 7 int num=0; 8 int n,k,m; 9 bool check(int sum){ 10 for(int i=1;i<=sum;i++){ 11 if(f[i][sum]==true&&color[i]==color[sum]){ 12 return false
; 13 } 14 } 15 return true; 16 }//這裡是判斷衝突的核心,當兩個圖連通時且顏色一樣就衝突 17 void dfs(int s){ 18 if(s>n){ 19 num++;//搜到n+1個點,也就是走完了 20 return; 21 } 22 for(int i=1;i<=m;i++){ 23 color[s]=i;//把顏色存下來 24 if(check(s)==true){ 25 dfs(s+1); 26 }else
{ 27 color[s]=0;//如果衝突則重新打回0 28 } 29 } 30 } 31 int main(){ 32 cin>>n>>k>>m; 33 for(int i=1;i<=k;i++){ 34 int x,y; 35 cin>>x>>y; 36 f[x][y]=true; 37 f[y][x]=true; 38 } 39 memset(color,0,sizeof(color)); 40 dfs(1); 41 cout<<num<<endl; 42 return 0; 43 }