dsalglib  1.0.0
dsalglib is a ready to use data structures and algorithms library written in C++ . Object Oriented Template implementations are written.
graph.h
Go to the documentation of this file.
1 //
2 // Created by moghya_s on 12/26/2016.
3 //
4 
5 #ifndef DSALGLIB_GRAPH_H
6 #define DSALGLIB_GRAPH_H
7 #include "linklist.h"
8 #include "stack.h"
9 #include "queue.h"
10 #include "array.h"
11 
12 
13 namespace dsa
14 {
15  template<class type>
16  class graph
17  {
18  private:
19 
20  long long int count;
21  long long int vindex;
22  struct arc
23  {
24  long long int end;
25  long long int cost;
26 
27  arc(long long int gvertex,long long int weight)
28  {
29  end=gvertex;
30  cost=weight;
31  }
32  arc()
33  {
34 
35  }
36 
37  bool operator==(arc temp)
38  {
39  if(end==temp.end&&cost==temp.cost)
40  return true;
41  else return false;
42  }
43  };
44 
45  struct gnode
46  {
47  type data;
48  long long int index;
49  linklist<arc> outadj;
50  linklist<arc> inadj;
51 
52  gnode(type param,long long int tindex)
53  {
54  data = param;
55  index = tindex;
56  }
57  gnode()
58  {
59 
60  }
61  };
62 
63  linklist<gnode> nodes;
64 
65  long long int _getindex(type param)
66  {
67  long long int i,size=nodes.size();
68  for(i=0;i<size;i++)
69  {
70  if(nodes[i].data==param) return i;
71  }
72  return -1;
73  }
74 
75  long long int _getby_vindex(long long int tvindex)
76  {
77  long long int i;
78  for(i=0;i<=tvindex;i++)
79  { if(nodes[i].index==tvindex)
80  return i;
81  }
82  return -1;
83 
84  }
85 
86  public:
88  {
89  count=0;
90  vindex = 0;
91  }
92 
93  bool add_vertex(type param)
94  {
95  if(_getindex(param)>-1)
96  return false;
97 
98  gnode vertex(param,vindex);
99  nodes.add_back(vertex);
100  count++;
101  vindex++;
102  return true;
103  }
104 
105  bool add_arc(type from,type to,long long int weight=0)
106  {
107  long long int findex=-1,tindex=-1;
108 
109  findex=_getindex(from);
110  tindex=_getindex(to);
111 
112  if(findex<0||tindex<0) return false;
113  arc edge(nodes[tindex].index,weight);
114 
115  if(nodes[findex].outadj.search(edge)>=0)
116  return false;
117 
118  nodes[findex].outadj.add_back(edge);
119 
120  edge.end = nodes[findex].index;
121  nodes[tindex].inadj.add_back(edge);
122 
123  return true;
124 
125  }
126 
127  bool dfstraverse(type param,void (fun)(type obj))
128  {
129  array<bool> visited(count,false);
130  long long int sindex = _getindex(param),temp,i,atemp;
132  if(sindex>-1)
133  {
134  s.push(sindex);
135  visited[sindex]=true;
136  while(!s.isempty())
137  {
138  temp = s.pop();
139  fun(nodes[temp].data);
140  for(i=0;i<nodes[temp].outadj.size();i++)
141  {
142  atemp = _getby_vindex(nodes[temp].outadj[i].end);
143  if(!visited[atemp])
144  {
145  s.push(atemp);
146  visited[atemp]=true;
147  }
148  }
149  }
150  return true;
151  }
152  else
153  return false;
154  }
155 
156  bool bfstraverse(type param,void (fun)(type obj))
157  {
158  array<bool> visit(count,false);
159  long long int sindex = _getindex(param),temp,i,atemp;
161  if(sindex>-1)
162  {
163  q.enqueue(sindex);
164  visit[sindex]=true;
165  while(!q.isempty())
166  {
167  temp = q.dequeue();
168  fun(nodes[temp].data);
169  for(i=0;i<nodes[temp].outadj.size();i++)
170  {
171  atemp = _getby_vindex(nodes[temp].outadj[i].end);
172  if(!visit[atemp])
173  {
174  q.enqueue(atemp);
175  visit[atemp]=true;
176  }
177  }
178  }
179  return true;
180  }
181  else
182  return false;
183  }
184 
185  bool remove_vertex(type param)
186  {
187  long long int tindex = _getindex(param),i,size,tvindex;
188  if(tindex<0) return false;
189 
190  arc temparc;
191 
192  size = nodes[tindex].outadj.size();
193  for(i=0;i<size;i++)
194  {
195  temparc = nodes[tindex].outadj[i];
196  tvindex = _getby_vindex(temparc.end);
197  nodes[tvindex].inadj.remove(temparc);
198  }
199 
200  size = nodes[tindex].inadj.size();
201  for(i=0;i<size;i++)
202  {
203  temparc = nodes[tindex].inadj[i];
204  tvindex = _getby_vindex(temparc.end);
205  nodes[tvindex].outadj.remove(temparc);
206  }
207  nodes.remove_at(tindex);
208  return true;
209  }
210 
211 
212  };
213 }
214 #endif //DSALGLIB_GRAPH_H
bool add_vertex(type param)
Definition: graph.h:93
Definition: alginc.h:12
bool isempty()
Definition: stack.h:119
bool dfstraverse(type param, void(fun)(type obj))
Definition: graph.h:127
type dequeue()
Definition: queue.h:84
bool bfstraverse(type param, void(fun)(type obj))
Definition: graph.h:156
type enqueue(type param)
Definition: queue.h:60
graph()
Definition: graph.h:87
bool add_arc(type from, type to, long long int weight=0)
Definition: graph.h:105
bool isempty()
Definition: queue.h:183
bool remove_vertex(type param)
Definition: graph.h:185
type push(type param)
Definition: stack.h:54
type pop()
Definition: stack.h:73