#include<iostream> using namespace std; int k, v, m; //v 顶点 k 边数 m 颜色种类 int ans; //记录最后答案 int col[1010]; //标记每个顶点所图颜色 int graph[1010][1010]; //二维数组存图 bool judge(int p, int color) //判断p点是否能图该颜色 { int i, flag = 1; // 遍历与p点相邻接的点,如果p点所图颜色与这些点相同,那么p点就不能图这个颜色 for (i = 1; i <= v; i++) { if (graph[p][i] == 1 && color == col[i]) return false; } return true; } void dfs(int vec) //深搜,可理解为给vec这点图颜色 { //如果当前所图的点的编号大于总共给的点的个数,那么说明此种图色方法可行 if (vec > v) { ans++; return; } int i; //遍历所有颜色,并判断是否能图这种颜色 for (i = 1; i <= m; i++) { if (judge(vec, i)) { col[vec] = i; dfs(vec + 1); col[vec] = 0; //回溯 } } } int main() { cin >> v >> k >> m; int i; for (i = 1; i <= k; i++) { int x, y; cin >> x >> y; graph[x][y] = 1; //注意是无向图 graph[y][x] = 1; } dfs(1); //从顶点1开始图色 cout << ans << endl; return 0; }
标签:颜色,求解,int,graph,着色,ans,顶点,1010,P1795 From: https://www.cnblogs.com/lhf123/p/17430785.html