Advertisement
lutunovoleg

Snatch

Dec 19th, 2023
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.53 KB | Source Code | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <random>
  4. #include <unordered_set>
  5.  
  6. using namespace std;
  7.  
  8. vector<vector<int>> generateRandomGraph(int numVertices, int numEdges) {
  9.     vector<vector<int>> adj(numVertices);
  10.     random_device rd;
  11.     mt19937 gen(rd());
  12.     uniform_int_distribution<int> dis(0, numVertices - 1);
  13.  
  14.     for (int i = 0; i < numEdges; ++i) {
  15.         int from = dis(gen);
  16.         int to = dis(gen);
  17.         adj[from].push_back(to);
  18.     }
  19.  
  20.     cout << "Generated graph (adjacency lists):" << endl;
  21.     for (int i = 0; i < numVertices; ++i) {
  22.         cout << i << " -> ";
  23.         for (int v : adj[i]) {
  24.             cout << v << " ";
  25.         }
  26.         cout << endl;
  27.     }
  28.  
  29.     return adj;
  30. }
  31.  
  32. vector<vector<int>> inputGraph() {
  33.     int numVertices, numEdges;
  34.     cout << "Enter the number of vertices and edges of the graph: " << endl;
  35.     cin >> numVertices >> numEdges;
  36.  
  37.     vector<vector<int>> adj(numVertices);
  38.  
  39.     cout << "Enter the edges in the 'u v' format where u -> v:" << endl;
  40.     for (int i = 0; i < numEdges; ++i) {
  41.         int u, v;
  42.         cin >> u >> v;
  43.         adj[u].push_back(v);
  44.     }
  45.  
  46.     cout << "Entered graph (adjacency lists):" << endl;
  47.     for (int i = 0; i < numVertices; ++i) {
  48.         cout << i << " -> ";
  49.         for (int v : adj[i]) {
  50.             cout << v << " ";
  51.         }
  52.         cout << endl;
  53.     }
  54.  
  55.     return adj;
  56. }
  57.  
  58. void dfs(int v, vector<vector<int>>& adj, vector<bool>& visited, vector<int>& path) {
  59.     visited[v] = true;
  60.     path.push_back(v);
  61.     for (int u : adj[v]) {
  62.         if (!visited[u]) {
  63.             dfs(u, adj, visited, path);
  64.         } else {
  65.             cout << "Cycle found: ";
  66.             for (int i = 0; i < path.size(); ++i) {
  67.                 if (path[i] == u) {
  68.                     for (int j = i; j < path.size(); ++j) {
  69.                         cout << path[j] << " ";
  70.                     }
  71.                     cout << endl;
  72.                     break;
  73.                 }
  74.             }
  75.         }
  76.     }
  77.     path.pop_back();
  78. }
  79.  
  80. void findCycles(vector<vector<int>>& adj) {
  81.     int n = adj.size();
  82.     vector<bool> visited(n, false);
  83.     vector<int> path;
  84.  
  85.     for (int v = 0; v < n; ++v) {
  86.         if (!visited[v]) {
  87.             dfs(v, adj, visited, path);
  88.         }
  89.     }
  90. }
  91.  
  92. int main() {
  93.     string a;
  94.     cout << "To enter your graph enter - 1, to generate random - 2"
  95.          << ",the default graph is something else." << endl;
  96.     cin >> a;
  97.     if (a == "1") {
  98.         vector<vector<int>> adj1 = inputGraph();
  99.         findCycles(adj1);
  100.     } else if (a == "2") {
  101.         int numVertices, numEdges;
  102.         cout << "Enter the number of vertices: ";
  103.         cin >> numVertices;
  104.  
  105.         int minEdges = numVertices - 1;
  106.         cout << "Enter the number of edges (at least " << minEdges << "): ";
  107.         cin >> numEdges;
  108.  
  109.         if (numEdges < minEdges || numEdges > numVertices * (numVertices - 1)) {
  110.             cout << "Invalid number of edges. Exiting program." << endl;
  111.             return 1;
  112.         }
  113.  
  114.         vector<vector<int>> adj1 = generateRandomGraph(numVertices, numEdges);
  115.         findCycles(adj1);
  116.     } else {
  117.         vector<vector<int>> adj = {{1}, {2}, {3, 4}, {0}, {5}, {4}};
  118.         cout << "Default graph (adjacency lists):" << endl;
  119.         for (int i = 0; i < adj.size(); ++i) {
  120.             cout << i << " -> ";
  121.             for (int v : adj[i]) {
  122.                 cout << v << " ";
  123.             }
  124.             cout << endl;
  125.         }
  126.  
  127.         findCycles(adj);
  128.     }
  129.  
  130.     return 0;
  131. }
  132.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement