Skip to content

Commit e9af63e

Browse files
authored
Elulerian graph algorithm in C++
1 parent d3288ba commit e9af63e

File tree

1 file changed

+150
-0
lines changed

1 file changed

+150
-0
lines changed

C++/elulerian_graph.cpp

+150
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
#include<iostream>
2+
#include <list>
3+
using namespace std;
4+
5+
6+
class Graph
7+
{
8+
int V;
9+
list<int> *adj;
10+
public:
11+
// Constructor and destructor
12+
Graph(int V) {this->V = V; adj = new list<int>[V]; }
13+
~Graph() { delete [] adj; }
14+
15+
16+
void addEdge(int v, int w);
17+
18+
19+
int isEulerian();
20+
21+
22+
bool isConnected();
23+
24+
25+
void DFSUtil(int v, bool visited[]);
26+
};
27+
28+
void Graph::addEdge(int v, int w)
29+
{
30+
adj[v].push_back(w);
31+
adj[w].push_back(v);
32+
}
33+
34+
void Graph::DFSUtil(int v, bool visited[])
35+
{
36+
37+
visited[v] = true;
38+
39+
40+
list<int>::iterator i;
41+
for (i = adj[v].begin(); i != adj[v].end(); ++i)
42+
if (!visited[*i])
43+
DFSUtil(*i, visited);
44+
}
45+
46+
47+
bool Graph::isConnected()
48+
{
49+
50+
bool visited[V];
51+
int i;
52+
for (i = 0; i < V; i++)
53+
visited[i] = false;
54+
55+
56+
for (i = 0; i < V; i++)
57+
if (adj[i].size() != 0)
58+
break;
59+
60+
61+
if (i == V)
62+
return true;
63+
64+
65+
DFSUtil(i, visited);
66+
67+
68+
for (i = 0; i < V; i++)
69+
if (visited[i] == false && adj[i].size() > 0)
70+
return false;
71+
72+
return true;
73+
}
74+
75+
76+
int Graph::isEulerian()
77+
{
78+
79+
if (isConnected() == false)
80+
return 0;
81+
82+
83+
int odd = 0;
84+
for (int i = 0; i < V; i++)
85+
if (adj[i].size() & 1)
86+
odd++;
87+
88+
89+
if (odd > 2)
90+
return 0;
91+
92+
return (odd)? 1 : 2;
93+
}
94+
95+
96+
void test(Graph &g)
97+
{
98+
int res = g.isEulerian();
99+
if (res == 0)
100+
cout << "graph is not Eulerian\n";
101+
else if (res == 1)
102+
cout << "graph has a Euler path\n";
103+
else
104+
cout << "graph has a Euler cycle\n";
105+
}
106+
107+
108+
int main()
109+
{
110+
111+
Graph g1(5);
112+
g1.addEdge(1, 0);
113+
g1.addEdge(0, 2);
114+
g1.addEdge(2, 1);
115+
g1.addEdge(0, 3);
116+
g1.addEdge(3, 4);
117+
test(g1);
118+
119+
Graph g2(5);
120+
g2.addEdge(1, 0);
121+
g2.addEdge(0, 2);
122+
g2.addEdge(2, 1);
123+
g2.addEdge(0, 3);
124+
g2.addEdge(3, 4);
125+
g2.addEdge(4, 0);
126+
test(g2);
127+
128+
Graph g3(5);
129+
g3.addEdge(1, 0);
130+
g3.addEdge(0, 2);
131+
g3.addEdge(2, 1);
132+
g3.addEdge(0, 3);
133+
g3.addEdge(3, 4);
134+
g3.addEdge(1, 3);
135+
test(g3);
136+
137+
138+
Graph g4(3);
139+
g4.addEdge(0, 1);
140+
g4.addEdge(1, 2);
141+
g4.addEdge(2, 0);
142+
test(g4);
143+
144+
145+
Graph g5(3);
146+
test(g5);
147+
148+
return 0;
149+
}
150+

0 commit comments

Comments
 (0)