從txt中讀取邊,判斷圖的連通性
圖
G = { V, E}
邊:連線兩個頂點
頂點和邊構成了圖,txt文件中儲存了邊的資訊。
從txt中讀取邊
typedef subgraph<adjacency_list<vecS, vecS, directedS, property<vertex_color_t, int>, property<edge_index_t, int>>> Graph;
std::ifstream ifs("edges.txt");
ifs >> std::noskipws; //從檔案中讀取空格
boost::spirit::istream_iterator f(ifs), l;
//spirit 根據EBNF規則對檔案進行分析
std::vector<std::pair<int, int>> edges;
bool parse_ok = qi::phrase_parse(f, l, (qi::int_ >> qi::int_) % qi::eol, qi::blank, edges); //從檔案中讀取邊
Graph g;
//將讀到的邊放入圖中
for(const auto edge : edges)
{
add_edge(edge.first, edge.second, g);
}
計算連通子圖數目
std::vector<int> comp(num_vertices(g)); //將邊的頂點放入comp
int num = connected_components (g, comp.data()); //計算連通數目
全部程式碼
#include <fstream>
#include <sstream>
#include <iostream>
#include <boost/fusion/adapted/std_pair.hpp>
#include <boost/spirit/include/qi.hpp>
#include <boost/graph/edge_list.hpp>
#include <boost/graph/subgraph.hpp>
#include <boost/graph/adjacency_list.hpp>
#include <boost/config.hpp>
#include <vector>
#include <boost/graph/connected_components.hpp>
using namespace std;
using namespace boost;
namespace qi = boost::spirit::qi;
// Underlying graph representation and implementation
//typedef adjacency_list_traits<vecS, vecS, directedS> Traits;
// Graph representation
typedef subgraph< adjacency_list<vecS, vecS, directedS,
property<vertex_color_t, int>, property<edge_index_t, int> > > Graph;
// Iterating over vertices and edges
typedef graph_traits<Graph>::vertex_iterator vertex_iter;
typedef graph_traits<Graph>::edge_iterator edge_iter;
int main(void)
{
std::ifstream ifs("edges0.txt");
ifs >> std::noskipws;
boost::spirit::istream_iterator f(ifs), l;
std::vector<std::pair<int, int>> edges;
bool parse_ok = qi::phrase_parse(f, l , (qi::int_ >> qi::int_) % qi::eol, qi::blank, edges);
Graph g;
for (const auto edge : edges )
{
add_edge(edge.first, edge.second, g);
}
std::vector<int> comp(num_vertices(g)); //將邊的頂點放入comp
int num = connected_components (g, comp.data()); //計算連通數目
std::cout << std::endl;
std::vector < int >::iterator i;
//將結果輸出到txt檔案
std::ofstream connect("/data6/wcm/document/UAV1/connect.txt");
connect << "Total number of components: " << num << std::endl;
// for (i = comp.begin(); i != comp.end(); ++i)
// std::cout << "Vertex " << i - comp.begin()
// << " is in component " << *i << std::endl;
std::vector<Graph* > comps(num);
for(size_t i=0;i<num;++i) {
comps[i] = & g.create_subgraph(); //comps[i]為子圖
}
for(size_t i=0;i<num_vertices(g);++i) {
// cout<<"add vetex "<<i<<" to sub graph "<<comp[i]<<endl;
add_vertex(i, *comps[comp[i]]); //
}
pair<vertex_iter, vertex_iter> vip;
connect << "Vertices in g = [ ";
vip = vertices(g);
for(vertex_iter vi = vip.first; vi != vip.second; ++vi) {
connect << *vi << " ";
}
connect << "]" << endl;
for(size_t i=0;i<num;i++)
{
connect << "Vertices (local) in comps [ " << i << " ]' = [ " ;
pair<vertex_iter, vertex_iter> lvip;
lvip = vertices(*comps[i]);
for(vertex_iter vi = lvip.first; vi != lvip.second; ++vi)
{
connect << (*comps[i]).local_to_global(*vi) << " ";
}
connect << "]" << endl;
}
return 0;
}
輸出txt
圖片: 有三個連通子圖,此圖不連通
相關文章
- 有向圖的連通性(判強連通)
- 圖論連通性圖論
- [複習] 圖連通性
- 20240628總結(圖的連通性)
- 圖論連通性相關圖論
- 有向圖的強連通性(java)Java
- 如何判斷一個點在地圖上?如何判斷一個點在多邊形內?地圖
- UML圖中時序圖的新增判斷條件時序圖
- js函式中的if判斷和a==b判斷JS函式
- JavaScript 判斷checkbox核取方塊是否選中JavaScript
- 連通性相關
- 判斷網路是否連線
- 判斷迴文連結串列
- python 中如何判斷獲取檢視變數的型別Python變數型別
- 視覺化學習:利用向量判斷多邊形邊界視覺化
- 讀取oracle long型別及判斷是否自動分割槽表Oracle型別
- js中的型別判斷JS型別
- Python如何讀取pdf中的圖片Python
- 從CF1702E看二分圖判斷的兩種方法
- c++ 從txt讀取資料 按照特殊字元拆分 gnssC++字元
- django中介軟體中判斷前端是不是ajax請求,從而判斷是否有許可權Django前端
- [20200228]如何判斷伺服器是exadata.txt伺服器
- 【SHELL】Shell中的條件判斷
- PostGIS管網連通性分析
- 如何判斷連結串列中是否有環並找出環的入口位置
- AutoCAD C# 判斷多邊形與點的位置關係C#
- JS的判斷語句:判斷、迴圈JS
- 判斷是否為環形連結串列
- Java 讀取PDF中的文字和圖片Java
- c++ (2-0) 從txt讀取和儲存資料C++
- C++(2) 從yml或者txt讀取和儲存資料C++
- python中字串格式判斷Python字串
- Python中None如何判斷PythonNone
- PbootCMS整理判斷是否連結賦值各種條件判斷和標籤boot賦值
- [20181213]ogg大量讀取操作.txt
- iOS 常用圖片格式判斷 (Swift)iOSSwift
- 使用telnet測試指定埠的連通性
- 【esp32 專案】中斷讀取按鍵