给出一个具有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
其他正确的输出:
3 3
5
6
15
我认为我应该使用深度优先搜索并计算距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;
}