如何在距离最小的树中找到S个或更少的节点?

时间:2018-12-04 19:43:25

标签: c++ algorithm tree depth-first-search

给出一个具有N个节点和N-1个边的未加权且无向的n元树。节点从0到N-1编号。我需要找到S个或更少的节点,以便以最小的距离D到达每个节点。输入的第一行是N(节点数)和S(最大输出节点数)。接下来的N-1行是边的描述。在输出上,我必须写D,S´(我使用的节点数)并标记为 来自S´的节点。例: 输入:

16 3
3 0
3 11
11 4
0 15
15 13
4 2
0 1
1 8
15 12
3 10
11 14
14 6
2 5
13 9
15 7

输出:

3 2
0
11

enter image description here

其他正确的输出:

3 3
5
6
15

enter image description here

我认为我应该使用深度优先搜索并计算距S最近节点的距离,并且应该使用二进制搜索来搜索最小的D。但是我在c ++中的实现存在问题。现在,我已经有了创建树的代码,但是我不知道在这种情况下如何使用深度优先搜索。

#include <iostream>
#include <stack>
#include <vector>
#include <stdio.h>
using namespace std;

// data structure to store graph edges
struct Edge {
    int src, dest;
};

// class to represent a graph object
class Graph
{
public:
    // construct a vector of vectors to represent an adjacency list
    vector<vector<int>> adjList;

    // Graph Constructor
    Graph(vector<Edge> const &edges, int N)
    {
        // resize the vector to N elements of type vector<int>
        adjList.resize(N);

        // add edges to the undirected graph
        for (auto &edge: edges)
        {
            adjList[edge.src].push_back(edge.dest);
            adjList[edge.dest].push_back(edge.src);
        }
    }
};

int main()
{
    int N, S;   // Number of nodes in the graph and number of 
    scanf("%d", &N);
    // vector of graph edges as per above diagram
    vector<Edge> edges;
    int a,b;
    for(int i = 0; i < (N-1); i++)
    {
        scanf("%d %d", &a, &b);
        edges.push_back({a, b});
    }
    // create a graph from given edges
    Graph graph(edges, N);

    return 0;
}

0 个答案:

没有答案