C++ 使每个节点都有一个已染色的邻居节点,需要染色的最少节点数量

C++ 使每个节点都有一个已染色的邻居节点,需要染色的最少节点数量

在这个问题中,我们将染色图中的最少节点,使得图中的每个节点与最远距离为1的一个已染色节点相邻。

最小化染色节点数量的简单逻辑是,要么染色奇数距离的节点,要么染色偶数距离的节点。因此,我们可以染色交替的节点,并且对于每个节点,我们可以找到一个最远距离为1的已染色节点。

问题陈述 - 给定一个包含N个节点和E条边的图。已知我们最多可以染色floor(N/2)个节点。我们需要找出要染色的最少节点数量,使得图中的每个节点的距离最大为1单位的染色节点。

注意 - 两个节点之间的距离为1单位。

示例示范

输入

1 -> 4, 1 -> 3, 4 -> 5, 4 -> 2

输出

4,3

解释 − 这是图表的可视化。

1
            /    \ 
           4      3 
          /  \ 
         2    5

因此,如果我们给4和3节点上色,我们可以使每个节点的着色节点最多相隔1个距离。

输入

1 -> 2, 1 -> 3, 1 -> 4, 1 -> 5

输出

1

解释 − 由于图中的所有节点都与1相连。如果我们对1进行染色,我们可以得到所需的结果。

方法

这种方法将使用映射数据结构存储访问过的节点。同时,我们将使用列表存储源节点到偶数距离和奇数距离的节点。最后,如果我们发现偶数距离的节点较少,我们将打印该节点。否则,我们将打印奇数距离的节点。

步骤

第1步 − 定义“visited”映射全局变量。同时,定义全局“odd_list”和“even_list”列表来存储偶数距离的节点。

第2步 − 在performBFS()函数中,将“head”初始化为1,并定义队列来存储距离和节点的配对。

第3步 − 将头部与距离0插入队列,并更新visited[head]为1。

第4步 − 遍历队列。

第4.1步 − 从队列中取出第一个配对。

第4.2步 − 如果距离是奇数,将节点插入“odd_list”列表。

第4.3步 − 否则,将节点插入“even_list”列表。

第4.4步 − 遍历当前节点的所有邻居节点。如果当前节点未被访问,则通过将距离增加1将其插入队列。同时,更新visited[p]为1。

第4.5步 − 在main()方法中,如果even_list的大小较小,则打印even_list的所有元素。否则,打印odd_list的所有元素。

示例

#include <bits/stdc++.h>
using namespace std;

// For storing the graph
map<int, vector<int>> grp;
// Stores the visited nodes
map<int, int> visited;
// To store nodes that are at odd and even distances from the root node
vector<int> odd_dist;
vector<int> even_dist;
void performBFS() {
    int head = 1;
    queue<pair<int, int>> que;
    // Add head node to queue
    que.push({head, 0});
    visited[head] = 1;
    while (!que.empty()) {
        // Get first noed
        int node = que.front().first;
        int dist = que.front().second;
        que.pop();
        // For odd distance
        if (dist & 1) {
            odd_dist.push_back(node);
        }
        // For even distance
        else {
            even_dist.push_back(node);
        }
        // Traverse neighbor nodes
        for (auto p : grp[node]) {
            // Get unvisited nodes
            if (!visited.count(p)) {
                que.push({p, (dist + 1)});
                visited[p] = 1;
            }
        }
    }
}
int main() {
    grp[1].push_back(4);
    grp[4].push_back(1);
    grp[2].push_back(4);
    grp[4].push_back(2);
    grp[3].push_back(1);
    grp[1].push_back(3);
    grp[4].push_back(5);
    grp[5].push_back(4);
    performBFS();
    cout << "The nodes we should color is ";
    // Print nodes at odd or even distances according to the total number of nodes
    if (odd_dist.size() < even_dist.size()) {
        for (int p : odd_dist) {
            cout << p << " ";
        }
    } else {
        for (int p : even_dist) {
            cout << p << " ";
        }
    }
    return 0;
}

输出

The nodes we should color is 4 3

时间复杂度 – O(N) 用于遍历所有节点。

空间复杂度 – O(N) 用于在队列中存储节点。

我们使用BFS遍历来访问给定图的每个节点。同时,我们还跟踪每个节点与源节点的距离,以过滤偶数距离和奇数距离的节点。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程