qscoj53(图的m着色问题)
题目链接:http://qscoj.cn/contest/12/problem/53/
题意:中文题诶~
思路:n个点, 那么最多用n种颜色,所以我们可以枚举颜色种类1~n,然后再判断用 i 种颜色可不可行;
对于如何判断,dfs一遍就好了。。。
代码:
1 #include<stdio.h> 2 #include<string.h> 3 #include <iostream> 4 #define MAXN 20 5 using namespace std; 6 7 int mp[MAXN][MAXN];//记录图 8 int vis[MAXN];//vis[i]记录i着的是哪种颜色 9 int sum=0;//保存可以着色的方案数 10 int m, n; 11 12 bool is_ok(int t, int i){//判断给节点t上颜色i是否可行 13 for(int j=1; j<t; j++){ 14 if(mp[t][j]&&vis[j]==i) 15 return false; 16 } 17 return true; 18 } 19 20 void dfs(int t, int cnt){//dfs判断用cnt中颜色是否可以给n个点着色 21 if(t>n){ 22 sum++; 23 return; 24 } 25 for(int i=1; i<=cnt; i++){ 26 if(is_ok(t, i)){ 27 vis[t]=i; 28 dfs(t+1, cnt); 29 vis[t]=0; 30 } 31 } 32 } 33 34 int main(void){ 35 while(scanf("%d%d", &n, &m)!=EOF){ 36 memset(mp, 0, sizeof(mp)); 37 for(int i=0; i<m; i++){ 38 int x, y; 39 scanf("%d%d", &x, &y); 40 mp[x][y]=mp[y][x]=1;//建临接矩阵 41 } 42 for(int i=1; i<=n; i++){//枚举颜色种数 43 memset(vis, 0, sizeof(vis)); 44 sum=0; 45 dfs(1, i); 46 if(sum){ 47 printf("%d\n", i); 48 break; 49 } 50 } 51 } 52 return 0; 53 }
我就是我,颜色不一样的烟火 --- geloutingyu