使用c++读取邻接矩阵然后使用boost库的graph计算每个节点的度使用贪心算法计算每个节点所属的模块最后将结果输出
以下是使用C++读取邻接矩阵,并使用Boost库的图计算每个节点的度、使用贪心算法计算每个节点所属的模块,最后将结果输出的示例代码:
#include <iostream>
#include <vector>
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/graph_traits.hpp>
#include <boost/graph/louvain_modularity.hpp>
using namespace std;
using namespace boost;
typedef adjacency_list<vecS, vecS, undirectedS> Graph; // 无向图类型
typedef typename graph_traits<Graph>::vertex_descriptor Vertex; // 顶点类型
int main() {
// 读取邻接矩阵
int n; // 节点数
cin >> n;
vector<vector<int>> adjacencyMatrix(n, vector<int>(n));
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> adjacencyMatrix[i][j];
}
}
// 构建图
Graph graph;
for (int i = 0; i < n; i++) {
add_vertex(graph);
}
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
if (adjacencyMatrix[i][j] == 1) {
add_edge(i, j, graph);
}
}
}
// 计算每个节点的度
vector<int> degrees(n);
for (int i = 0; i < n; i++) {
degrees[i] = degree(i, graph);
}
// 使用贪心算法计算每个节点所属的模块
vector<int> moduleMap(n);
louvain_modularity(graph, make_iterator_property_map(moduleMap.begin(), get(vertex_index, graph)));
// 输出结果
cout << "Degrees: ";
for (int i = 0; i < n; i++) {
cout << degrees[i] << " ";
}
cout << endl;
cout << "Module Map: ";
for (int i = 0; i < n; i++) {
cout << moduleMap[i] << " ";
}
cout << endl;
return 0;
}
注意需要链接Boost库,并且编译时需要加上-std=c++11参数。邻接矩阵的输入格式为先输入节点数n,然后输入n行n列的矩阵,矩阵元素为0或1,表示是否存在边。输出结果包括每个节点的度和每个节点所属的模块
原文地址: https://www.cveoy.top/t/topic/ilV5 著作权归作者所有。请勿转载和采集!