一棵树总是二等图,因为我们总是可以分成两个具有交替级别的不相交集。
换句话说,我们总是用两种颜色对其进行着色,以使备用色阶具有相同的颜色。任务是计算最大编号。可以添加到树中的边的数量,以便保留为二部图。
树边以顶点对表示,如下所示-
{1,2}
{1,3}
{2,4}
{3,5}然后我们需要2个更多的边来保持它的二部图
在着色图中,来自两个不同集合的图{1,4,5}和{2,3}。因为1和2和3都相连
我们只剩下边4和5。由于4已连接到2和5至3。仅剩下的选项是{4,3}和{5,2}
对图形进行简单的DFS或BFS遍历,并用两种颜色对其进行着色
同时着色还跟踪用两种颜色着色的节点数。设两个计数为count_color0和count_color1
现在我们知道二部图可以具有的最大边数是count_color0 x count_color1
我们还知道具有n个节点的树具有n-1边
所以我们的答案是count_color0 x count_color1 –(n-1)
#include <bits/stdc++.h> using namespace std; long long count_color[2]; void dfs(vector<int> graph[], int node, int parent, int color) { ++count_color[color]; for (int i = 0; i < graph[node].size(); ++i) { if (graph[node][i] != parent) { dfs(graph, graph[node][i], node, !color); } } } int getMaxEdges(vector<int> graph[], int n) { dfs(graph, 1, 0, 0); return count_color[0] * count_color[1] - (n - 1); } int main() { int n = 5; vector<int> graph[n + 1]; graph[1].push_back(2); graph[1].push_back(3); graph[2].push_back(4); graph[3].push_back(5); cout << "Maximum edges = " << getMaxEdges(graph, n) << endl; return 0; }
输出结果
当您编译并执行上述程序时。它产生以下输出-
Maximum edges = 2