Graph
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), _nvert(0)
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 
46  // Determine the neighborhood for each vertex
47  vector<vector<unsigned int>> n2n(nnode);
48  for (size_t k=0; k<_edges.size(); ++k)
49  {
50  const int v0 = _edges[k][0];
51  const int v1 = _edges[k][1];
52  n2n.at(v0).push_back(v1); // add v1 to neighborhood of v0
53  n2n.at(v1).push_back(v0); // and vice versa
54  }
55  // ascending sort of entries per node
56  for (size_t k=0; k<n2n.size(); ++k)
57  {
58  sort(n2n[k].begin(),n2n[k].end());
59  }
60 
61 
62  return n2n;
63 }
64 
65  void graph::DetermineNumberVertices()
66  {
67  // we assume that the nodes are numbered consecutively from 0 to n-1
68  // determine number of nodes
69  unsigned int nnode=0;
70  for (size_t k=0; k<_edges.size(); ++k)
71  {
72  for (size_t j=0; j<_edges[k].size(); ++j)
73  {
74  nnode=max(nnode,_edges[k][j]);
75  }
76  }
77  if (_edges.size()>0) ++nnode; // more than 1 edge i graph?
78  _nvert = nnode;
79  }
80 
81 ostream& operator<<(ostream &s, graph const &rhs)
82 {
83  auto &edges=rhs._edges;
84  s << "\n -- Edges --\n";
85  for (size_t k=0; k<edges.size(); ++k)
86  {
87  s << k << " : ";
88  for (size_t j=0; j<edges[k].size(); ++j)
89  {
90  s << edges[k][j] << " ";
91  }
92  s << endl;
93  }
94 
95  s << "Graph with " << rhs.Nedges() << " edges and " << rhs.Nvertices() << " vertices" << endl;
96 
97  return s;
98 }
99 
size_t Nvertices() const
Definition: graph.h:46
std::vector< std::vector< unsigned int > > get_node2nodes() const
Definition: graph.cpp:42
size_t Nedges() const
Definition: graph.h:38
Definition: graph.h:12
friend std::ostream & operator<<(std::ostream &s, graph const &rhs)
graph(const std::string &file_name)
Reads edges for graph from file.