P1795 求解图的 m 着色问题

发布时间 2023-05-25 12:10:46作者: 刘海烽
#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;
}