题目描述:
众所周知红黑树是一种平衡树,它最突出的特性就是不能有两个相邻的红色节点。
那我们定义一个红黑图,也就是一张无向图中,每个节点可能有红黑两种颜色,但我们必须保证没有两个相邻的红色节点。
现在给出一张未染色的图,只能染红黑两色,问总共有多少种染色方案使得它成为一个红黑图。输入描述:
第一行两个数字n m,表示图中有n个节点和m条边。
接下来共计m行,每行两个数字s t,表示一条连接节点s和节点t的边,节点编号为[0,n)。输出描述:
一个数字表示总的染色方案数。补充说明:
0<n<15
0<=m <=n * 30<= s, t < n不保证图连通
保证没有重边和自环
补充说明:0<n<15
0<= m<=n * 30<= s, t < n不保证图连通
保证没有重边和自环
示例1
输入:
3 3
0 1
0 2
1 2
输出:4
示例2
输入:
4 3
0 1
1 2
2 3
输出:8
示例3
输入:
4 3
0 1
0 21
2
输出:8
#include <iostream>
#include <vector>
#include <queue>
#include <string>
using namespace std;
void dfs(vector<vector<int>>&G,vector<int>&color,int u,int& res)
{
if (color.size() == u)
{
res++;
return;
}
if (color[u] == 0)
{
color[u] = 1;
dfs(G, color, u + 1,res);
color[u] = 2;
for (int v : G[u])
{
color[v] = 1;
}
dfs(G, color, u + 1,res);
}
else
dfs(G, color, u + 1,res);
color[u] = 0;
}
int main()
{
int m, n;
cin >> n >> m;
vector<vector<int>>G(n);
vector<int>color(n);
for (int i = 0; i < m; i++)
{
int u, v;
cin >> u >> v;
G[u].push_back(v);
G[u].push_back(u);
}
int res = 0;
dfs(G, color, 0,res);
cout << res;
return 0;
}