1
+
2
+
3
+
4
+ bool Graph::hasEulerianPath (vector<int > &in, vector<int > &out){
5
+ int inNodes=0 , edNodes=0 ;
6
+ for (int i=1 ;i<=numOfNodes;i++){
7
+ out[i]=G[i].size ();
8
+ for (int child:G[i])
9
+ in[child]++;
10
+ }
11
+
12
+ for (int i=1 ;i<=numOfNodes;i++){
13
+ if (out[i]-in[i]>1 || in[i]-out[i]>1 ) return false ;
14
+ if (out[i]-in[i]==1 ) inNodes++;
15
+ else if (in[i]-out[i]==1 ) edNodes++;
16
+ }
17
+ return ( (inNodes==0 && edNodes==0 ) ||
18
+ (inNodes==1 && edNodes==1 ) );
19
+ }
20
+
21
+ int Graph::findStartingNode (vector<int > in, vector<int > out){
22
+ int startingNode = 0 ;
23
+ for (int i=1 ;i<=numOfNodes;i++){
24
+ if (out[i]-in[i]==1 ) return i;
25
+ if (out[i]) startingNode=i;
26
+ }
27
+ return startingNode;
28
+ }
29
+
30
+ int Graph::findEndingNode (vector<int > in, vector<int > out){
31
+ int endingNode = 0 ;
32
+ for (int i=1 ;i<=numOfNodes;i++){
33
+ if (in[i]-out[i]==1 ) return i;
34
+ if (in[i]) endingNode=i;
35
+ }
36
+ return endingNode;
37
+ }
38
+
39
+ void Graph::eulerianTraversal (int cur, vector<int > &path, vector<int > &order){
40
+ // cout<<" "<<cur;
41
+ order[cur]++;
42
+ if (order[cur]>G[cur].size ()) return ;
43
+ eulerianTraversal (G[cur][order[cur]-1 ], path, order);
44
+
45
+ path.push_back (cur);
46
+ }
47
+
48
+ void Graph::eulerPath (){
49
+ vector<int > path;
50
+ vector<int > inDegree (numOfNodes+1 ,0 );
51
+ vector<int > outDegree (numOfNodes+1 ,0 );
52
+ vector<int > order (numOfNodes+1 ,0 );
53
+
54
+ bool isPath = hasEulerianPath (inDegree,outDegree);
55
+ cout<<" \n isPath: " <<isPath<<" \n " ;
56
+
57
+ if (!isPath){ cout<<" \n No Eulerian Path!\n " ;return ;}
58
+
59
+ int st = findStartingNode (inDegree,outDegree);
60
+ int ed = findEndingNode (inDegree,outDegree);
61
+ cout<<" \n startingNode: " <<st;
62
+ eulerianTraversal (st, path, order);
63
+ cout<<" \n endingNode: " <<ed;
64
+
65
+
66
+ reverse (path.begin (),path.end ());
67
+ path.push_back (ed);
68
+
69
+ // Make sure the graph is not disconnected
70
+ if (path.size () != numOfEdges+1 ){
71
+ cout<<" \n Graph is disconnected!!!\n " ;
72
+ return ;
73
+ }
74
+ cout<<" \n Path is: " ;
75
+ for (int node:path) cout<<" " <<node;
76
+ }
0 commit comments