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
", i);
48                 break;
49             }
50         }
51     }
52     return 0;
53 }
View Code
原文地址:https://www.cnblogs.com/geloutingyu/p/6666476.html