分别用广度优先搜索得到以每个顶点为根节点的最小半径的生成树,然后从这些生成树中找出半径最小的作为本题的解。
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
struct SpanningTree //生成树的半径及其层次遍历序列
{
int radius = 0; //半径
vector <int> hierarchically_traverse_seq; //层次遍历序列
};
int** build_adjacency_matrix(int n) //输入一个图,用邻接矩阵表示,以输入两个负数结束
{
int** adjacency_matrix = new int* [n]; //初始化邻接矩阵,使其每个元素都为0
for (int i = 0; i < n; i++)
{
adjacency_matrix[i] = new int[n];
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
adjacency_matrix[i][j] = 0;
}
}
int a, b; //输入边,a和b分别是边所连接的两个顶点
cout << "Please input each edge" << endl;
cin >> a >> b;
while (a >= 0 && b >= 0)
{
adjacency_matrix[a][b] = adjacency_matrix[b][a] = 1;
cin >> a >> b;
}
return adjacency_matrix;
}
/*以序号为initial_vertex的顶点作为根节点,通过广度优先搜索建造半径最小的生成树*/
SpanningTree hierarchically_traverse(int** adjacency_matrix, int initial_vertex, int n)
{
SpanningTree st;
queue <int> vertex_queue; //顶点队列
vector <int> dist(n, 0); //各个顶点到根节点的距离
vector <int> visited(n, 0); //记录每个顶点是否被访问过,1表示访问过,0表示没访问过
/*广度优先搜索*/
st.hierarchically_traverse_seq.push_back(initial_vertex);
vertex_queue.push(initial_vertex);
visited[initial_vertex] = 1;
while (!vertex_queue.empty())
{
int head = vertex_queue.front();
for (int j = 0; j < n; j++)
{
if (adjacency_matrix[head][j] == 1 && visited[j] == 0)
{
vertex_queue.push(j);
st.hierarchically_traverse_seq.push_back(j);
visited[j] = 1;
dist[j] = dist[head] + 1; //计算各个顶点到根节点的距离
}
}
vertex_queue.pop();
}
/*计算生成树的半径*/
st.radius = dist[0];
for (int i = 1; i < dist.size(); i++)
{
if (st.radius < dist[i])
st.radius = dist[i];
}
return st;
}
int main(void)
{
int n; //顶点数
cout << "Please input the quantity of vertexes: ";
cin >> n;
int** adjacency_matrix = build_adjacency_matrix(n); //建立邻接矩阵
vector <SpanningTree> st(n); //用于分别记录以每个顶点为根节点的生成树
for (int i = 0; i < n; i++)
st[i] = hierarchically_traverse(adjacency_matrix, i, n);
/*找出半径最小的生成树*/
int min_radius = 0;
for (int i = 1; i < n; i++)
{
if (st[i].radius < st[min_radius].radius)
min_radius = i;
}
cout << endl;
cout << "The minimal radius is " << st[min_radius].radius << endl;
cout << "The hierarchically traverse of the spanning tree is: ";
for (int i = 0; i < n; i++)
cout << st[min_radius].hierarchically_traverse_seq[i] << ' ';
cout << endl;
return 0;
}