Graph 2
graph.cpp
Go to the documentation of this file.
1 #include "graph.h"
2 #include <algorithm>
3 #include <array>
4 #include <cassert>
5 #include <fstream>
6 #include <iostream>
7 #include <stdexcept>
8 #include <string>
9 #include <vector>
10 using namespace std;
11 
12 graph::graph(const string &file_name)
13 : _edges(0), _vertices(), _maxvert(-1) // graph_2
14 {
15  ifstream fin(file_name); // Oeffne das File im ASCII-Modus
16  if ( fin.is_open() ) { // File gefunden:
17 // _edges.clear(); // Vektor leeren
18  unsigned int k,l;
19  while ( fin >> k >> l) _edges.push_back({k,l}); // Einlesen
20  if (!fin.eof()) {
21  // Fehlerbehandlung
22  cout << " Error handling \n";
23  if ( fin.bad() ) throw runtime_error("Schwerer Fehler in istr");
24  if ( fin.fail() ) { // Versuch des Aufraeumens
25  cout << " Failed in reading all data.\n";
26  fin.clear();
27  }
28  }
29  _edges.shrink_to_fit();
30  }
31  else { // File nicht gefunden:
32  cout << "\nFile " << file_name << " has not been found.\n\n" ;
33  assert( fin.is_open() && "File not found." ); // exeption handling for the poor programmer
34  }
35 
36  DetermineNumberVertices();
37 
38  return;
39 }
40 
41 
42 vector<vector<unsigned int>> graph::get_node2nodes() const
43 {
44 // size_t nnode=Nvertices();
45  size_t nnode=Max_vertex()+1; // graph_2
46 
47  // Determine the neighborhood for each vertex
48  vector<vector<unsigned int>> n2n(nnode);
49  for (size_t k=0; k<_edges.size(); ++k)
50  {
51  const int v0 = _edges[k][0];
52  const int v1 = _edges[k][1];
53  n2n.at(v0).push_back(v1); // add v1 to neighborhood of v0
54  n2n.at(v1).push_back(v0); // and vice versa
55  }
56  // ascending sort of entries per node
57  for (size_t k=0; k<n2n.size(); ++k)
58  {
59  sort(n2n[k].begin(),n2n[k].end());
60  }
61 
62 
63  return n2n;
64 }
65  // graph_2
66  void graph::DetermineNumberVertices()
67  {
68  // we assume that the nodes are numbered consecutively from 0 to n-1
69  // determine number of nodes
70  _vertices.clear();
71  unsigned int nnode=0;
72  for (size_t k=0; k<_edges.size(); ++k)
73  {
74  for (size_t j=0; j<_edges[k].size(); ++j)
75  {
76  nnode=max(nnode,_edges[k][j]);
77  _vertices.insert(_edges[k][j]); // graph_2
78  }
79  }
80  if (_edges.size()>0) _maxvert=nnode; // more than 1 edge i graph?
81  }
82 
83 ostream& operator<<(ostream &s, graph const &rhs)
84 {
85  s << "Graph with " << rhs.Nedges() << " edges and " << rhs.Nvertices() << " vertices" << endl;
86 
87  auto &edges=rhs._edges;
88  s << "\n -- Edges --\n";
89  for (size_t k=0; k<edges.size(); ++k)
90  {
91  s << k << " : ";
92  for (size_t j=0; j<edges[k].size(); ++j)
93  {
94  s << edges[k][j] << " ";
95  }
96  s << endl;
97  }
98 
99  s << "\n -- Vertices --\n"; // graph_2
100  for (auto v: rhs._vertices) // graph_2
101  {
102  s << v << " ";
103  }
104  s << endl;
105 
106  return s;
107 }
108 
Definition: graph.h:12
size_t Nedges() const
Definition: graph.h:38
size_t Max_vertex() const
Definition: graph.h:54
graph(const std::string &file_name)
Reads edges for graph from file.
size_t Nvertices() const
Definition: graph.h:46
std::vector< std::vector< unsigned int > > get_node2nodes() const
Definition: graph.cpp:42
ostream & operator<<(ostream &s, graph const &rhs)
Definition: graph.cpp:83