diff --git a/graphColoringAlgo/greedyGraphColoring/greedyGraphColoring.cpp b/graphColoringAlgo/greedyGraphColoring/greedyGraphColoring.cpp new file mode 100644 index 0000000..9ee4006 --- /dev/null +++ b/graphColoringAlgo/greedyGraphColoring/greedyGraphColoring.cpp @@ -0,0 +1,181 @@ +#include +using namespace std; +typedef long long ll; +typedef vector vi; +typedef pair pi; +typedef vector vii; +typedef deque dqi; +typedef queue qi; +typedef priority_queue pqi; + +#define ll long long int +#define ld long double +#define mp make_pair +#define pb push_back +#define ppb pop_back +#define pf push_front +#define ppf pop_front +#define all(x) (x).begin(), (x).end() +#define uniq(v) (v).erase(unique(all(v)), (v).end()) +#define sz(x) (ll)((x).size()) +#define fr first +#define sc second +#define rep(i, a, b) for (int i = a; i < b; i++) +#define mem1(a) memset(a, -1, sizeof(a)) +#define mem0(a) memset(a, 0, sizeof(a)) +#define in(x) cin >> x +#define tc \ + int t; \ + cin >> t; \ + while (t--) +#define no "NO" << endl +#define yes "YES" << endl +#define sp " " +#define speed \ + cin.sync_with_stdio(false); \ + cin.tie(NULL); \ + cout.tie(NULL); + +int npower(int x, int n) +{ + int res = 1; + while (n) + { + if (n % 2) + res = (res * x); + n /= 2; + x = (x * x); + } + return res; +} +int modpow(int x, int n, int M) +{ + x = x % M; + int res = 1; + while (n) + { + if (n % 2) + { + res = (res * x) % M; + } + n /= 2; + x = (x * x) % M; + } + return res; +} +int gcd(int a, int b) +{ + if (!b) + return a; + return gcd(b, a % b); +} +class Graph +{ + int V; // No. of vertices + list *adj; // A dynamic array of adjacency lists +public: + // Constructor and destructor + Graph(int V) + { + this->V = V; + adj = new list[V]; + } + ~Graph() { delete[] adj; } + + // function to add an edge to graph + void addEdge(int v, int w); + + // Prints greedy coloring of the vertices + void greedyColoring(); +}; + +void Graph::addEdge(int v, int w) +{ + adj[v].push_back(w); + adj[w].push_back(v); // Note: the graph is undirected +} + +// Assigns colors (starting from 0) to all vertices and prints +// the assignment of colors +void Graph::greedyColoring() +{ + int result[V]; + + // Assign the first color to first vertex + result[0] = 0; + + // Initialize remaining V-1 vertices as unassigned + for (int u = 1; u < V; u++) + result[u] = -1; // no color is assigned to u + + // A temporary array to store the available colors. True + // value of available[cr] would mean that the color cr is + // assigned to one of its adjacent vertices + bool available[V]; + for (int cr = 0; cr < V; cr++) + available[cr] = false; + + // Assign colors to remaining V-1 vertices + for (int u = 1; u < V; u++) + { + // Process all adjacent vertices and flag their colors + // as unavailable + list::iterator i; + for (i = adj[u].begin(); i != adj[u].end(); ++i) + if (result[*i] != -1) + available[result[*i]] = true; + + // Find the first available color + int cr; + for (cr = 0; cr < V; cr++) + if (available[cr] == false) + break; + + result[u] = cr; // Assign the found color + + // Reset the values back to false for the next iteration + for (i = adj[u].begin(); i != adj[u].end(); ++i) + if (result[*i] != -1) + available[result[*i]] = false; + } + + // print the result + for (int u = 0; u < V; u++) + cout << "Vertex " << u << " ---> Color " + << result[u] << endl; +} + +// Driver program to test above function + +void solve() +{ + + Graph g1(5); + g1.addEdge(0, 1); + g1.addEdge(0, 2); + g1.addEdge(1, 2); + g1.addEdge(1, 3); + g1.addEdge(2, 3); + g1.addEdge(3, 4); + cout << "Coloring of graph 1 \n"; + g1.greedyColoring(); + + Graph g2(5); + g2.addEdge(0, 1); + g2.addEdge(0, 2); + g2.addEdge(1, 2); + g2.addEdge(1, 4); + g2.addEdge(2, 4); + g2.addEdge(4, 3); + cout << "\nColoring of graph 2 \n"; + g2.greedyColoring(); +} +int main() +{ + speed; + // tc + { + solve(); + } + return 0; +} \ No newline at end of file