source_removal.cpp File Reference
#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
#include <cassert>

Classes

class  DynamicDirectedGraph
 

Functions

template<typename Iter >
Iter source_removal (DynamicDirectedGraph &G, Iter dest)
 
int main ()
 

Function Documentation

int main ( )
163  {
165  G.add_edge(0, 1);
166  G.add_edge(0, 2);
167  G.add_edge(1, 2);
168  G.add_edge(3, 0);
169  G.add_edge(4, 3);
170  G.add_edge(4, 0);
171  G.add_edge(5, 0);
172  G.add_edge(5, 2);
173  G.add_edge(5, 4);
174 
175 
176  vector<int> top_order(G.no_of_vertices());
177  vector<int>::iterator last = source_removal(G, top_order.begin());
178  for(auto elt : top_order)
179  cout << elt << endl;
180 
181  return 0;
182 }
Iter source_removal(DynamicDirectedGraph &G, Iter dest)
Definition: source_removal.cpp:128
Definition: source_removal.cpp:40
template<typename Iter >
Iter source_removal ( DynamicDirectedGraph G,
Iter  dest 
)
128  {
129  queue<int> q;
130  vector<int> vertices(G.no_of_vertices());
131 
132  auto last = G.get_vertices(vertices.begin());
133  for(auto it = vertices.begin(); it != last; it++)
134  if(G.in_degree(*it) == 0)
135  q.push(*it);
136 
137 
138  int processed_vertices = 0;
139 
140  while(!q.empty()) {
141  int visit = q.front();
142  q.pop();
143  processed_vertices++;
144 
145  *dest++ = visit; // Push the element to final list
146 
147  vector<int> adj(G.no_of_vertices());
148  auto last = G.adjTo(visit, adj.begin());
149  for(auto it = adj.begin(); it != last; it++) {
150  G.delete_edge(visit, *it);
151  if(G.in_degree(*it) == 0)
152  q.push(*it);
153  }
154  }
155 
156  assert(processed_vertices == G.no_of_vertices());
157 
158 
159  return dest;
160 }
Iter adjTo(int vertex, Iter dest)
Definition: source_removal.cpp:97
int in_degree(int vertex)
Definition: source_removal.cpp:118
void delete_edge(int u, int v)
Definition: source_removal.cpp:112
Iter get_vertices(Iter dest)
Definition: source_removal.cpp:86
int no_of_vertices()
Definition: source_removal.cpp:92