暴力:考察当前节点是否可以用已经用过的颜色填充,或者用一个新颜色填充。这题胡乱暴力应该是可以过的,但是暴力姿势不对会超时。
AC代码
#include <stdio.h>
#include <string.h>
#include <vector>
#include <algorithm>
using namespace std;
#define INF 0x3f3f3f3f
const int MAXN = 100 + 5;
int G[MAXN][MAXN];
int room[MAXN][MAXN], cnt[MAXN];
int n, m, ans;
void dfs(int cur, int tol) {
if(tol >= ans) return;
if(cur > n) {
ans = min(ans, tol);
return;
}
for(int i = 0; i < tol; i++) {
int f = 1;
for(int j = 0; j < cnt[i]; j++) {
int t = room[i][j];
if(G[cur][t]) {
f = 0;
break;
}
}
if(f) {
room[i][cnt[i]++] = cur;
dfs(cur+1, tol);
--cnt[i];
}
}
room[tol][cnt[tol]++] = cur;
dfs(cur+1, tol+1);
--cnt[tol];
}
int main() {
while(scanf("%d%d", &n, &m) == 2) {
memset(G, 0, sizeof(G));
int x, y;
for(int i = 0; i < m; i++) {
scanf("%d%d", &x, &y);
G[x][y] = G[y][x] = 1;
}
memset(cnt, 0, sizeof(cnt));
ans = INF;
dfs(1, 0);
printf("%d\n", ans);
}
return 0;
}
如有不当之处欢迎指出!!