Advertisement
minh_tran_782

Graph

Aug 19th, 2022 (edited)
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.13 KB | None | 0 0
  1.      void DFSHelp(int v, Adjacency* result,bool* visited){
  2.         visited[v] = true;
  3.         result->push(v);
  4.         for (int i = 0; i < adj[v].getSize(); ++i){
  5.             int index = adj[v].getElement(i);
  6.             if (visited[index] == false) DFSHelp(index,result,visited);
  7.         }
  8.         return;
  9.     }
  10.     Adjacency *DFS(int v)
  11.     {
  12.         bool* visited = new bool[V];
  13.         for (int i = 0; i < V; ++i){
  14.             visited[i] = false;
  15.         }
  16.         Adjacency* result = new Adjacency();
  17.         DFSHelp(v,result,visited);
  18.         delete[] visited;
  19.         return result;
  20.     }
  21. ----------------------------------------
  22. // Some helping functions
  23. #define INF 1000
  24. int minDistance(vector<int>& dist, vector<bool>& supportSet){
  25.     int min = INF;
  26.     int min_index = 0;
  27.     for (int i = 0; i < (int)dist.size(); ++i){
  28.         if (supportSet[i] == false && dist[i] <= min){
  29.             min = dist[i];
  30.             min_index = i;
  31.         }
  32.     }
  33.     return min_index;
  34. }
  35. int Dijkstra(int** graph, int src, int dst) {
  36.     int size = *(&graph[0] + 1) - graph[0];
  37.     vector<int> distance(size,INF); // to store distance from src to dst.
  38. /*return true if vertex i is included in shortest path or
  39.   shortest distance from src to i is finalized.
  40.   */
  41.     vector<bool> supportSet(size,false);
  42.     distance[src] = 0;
  43. for (int i = 0; i < size - 1; ++i){
  44.     int u = minDistance(distance,supportSet);
  45.     supportSet[u] = true;
  46.     for (int v = 0; v < size; ++v ){
  47.         if (supportSet[v] == false && graph[u][v] && distance[u] != INF
  48.                 && distance[u] + graph[u][v] < distance[v])
  49.                 distance[v] = distance[u] + graph[u][v];
  50.     }
  51. }
  52.     return distance[dst];
  53.     // TODO: return the length of the shortest path from src to dst.
  54.    
  55. }
  56.  
  57. ------------------------------------------------------
  58. #include<iostream>
  59. #include <list>
  60. using namespace std;
  61.  
  62. class DirectedGraph
  63. {
  64.     int V;
  65.     list<int> *adj;
  66.     bool isCyclicUtil(int v, bool visited[], bool *rs);
  67. public:
  68.     DirectedGraph(){
  69.         V = 0;
  70.         adj = NULL;
  71.     }
  72.     DirectedGraph(int V)
  73.     {
  74.         this->V = V;
  75.         adj = new list<int>[V];
  76.     }
  77.     void addEdge(int v, int w)
  78.     {
  79.         adj[v].push_back(w);
  80.     }
  81.     bool isCyclic()
  82.     {
  83.         bool* visited = new bool[V];
  84.         bool* recursionStack = new bool[V];
  85.        
  86.         for (int i = 0; i< V;++i){
  87.             visited[i] = false;
  88.             recursionStack[i] = false;
  89.         }
  90.         for (int i = 0; i < V; ++i){
  91.             if (visited[i] == false && isCyclicUtil(i,visited,recursionStack) == true) {
  92.                  delete[] visited;
  93.                  delete[] recursionStack;
  94.                  return true;
  95.             }
  96.         }
  97.         delete[] visited;
  98.         delete[] recursionStack;
  99.         return false;
  100.         // Student answer
  101.     }
  102. };
  103. bool DirectedGraph::isCyclicUtil(int v, bool visited[], bool *rs){
  104.     if (visited[v] == false){
  105.         visited[v] = true;
  106.         rs[v] = true;
  107.         for (auto& i : adj[v]){
  108.             if (visited[i] == false && isCyclicUtil(i,visited,rs) == true) return true;
  109.             else if (rs[i] == true) return true;
  110.             }
  111.         }
  112.     rs[v] = false;
  113.     return false;
  114. }
  115. --------------------------------------------------------------
  116. // Some helping functions
  117. int find_set(int i,int* parent){
  118.     if (i == parent[i]) return i;
  119.     return find_set(parent[i],parent);
  120. }
  121. void union_set(int u, int v, int* parent) {
  122.   parent[u] = parent[v];
  123. }
  124. int kruskalMST() {
  125.     vector< pair<int, pair<int, int>> > mst;
  126.     int* parent = new int[V];
  127.     for (int i = 0; i < V; i++) parent[i] = i;
  128.     // TODO: return weight of the minimum spanning tree.
  129.     int uRep, vRep;
  130.     sort(edges.begin(),edges.end());
  131.     for (int i = 0; i < (int)edges.size(); ++i){
  132.         uRep = find_set(edges[i].second.first,parent);
  133.         vRep = find_set(edges[i].second.second,parent);
  134.         if (uRep != vRep){
  135.             mst.push_back(edges[i]);
  136.             union_set(uRep,vRep,parent);
  137.         }
  138.     }
  139.     delete[] parent;  
  140. int result = 0;
  141. for (auto& i : mst){
  142.     result  = result + i.first;
  143. }
  144. return result;
  145.     }
  146.     ===============================================
  147. class Graph {
  148.  
  149.     int V;
  150.     Adjacency* adj;
  151.  
  152. public:
  153.     Graph(int V){
  154.         this->V = V;
  155.         adj = new Adjacency[V];
  156.     }
  157.     void addEdge(int v, int w){
  158.         adj[v].push(w);
  159.     }
  160.    
  161.     //Heling functions
  162. bool isCyclicUtil(int v, bool* visited, bool *rs){
  163.     if (visited[v] == false){
  164.         visited[v] = true;
  165.         rs[v] = true;
  166.         for (int i = 0; i < adj[v].getSize(); ++i){
  167.             int index = adj[v].getElement(i);
  168.             if (visited[index] == false && isCyclicUtil(index,visited,rs) == true) return true;
  169.             else if (rs[index] == true) return true;
  170.             }
  171.         }
  172.     rs[v] = false;
  173.     return false;
  174. }
  175.         bool isCyclic()
  176.     {
  177.         bool* visited = new bool[V];
  178.         bool* recursionStack = new bool[V];
  179.        
  180.         for (int i = 0; i< V;++i){
  181.             visited[i] = false;
  182.             recursionStack[i] = false;
  183.         }
  184.         for (int i = 0; i < V; ++i){
  185.             if (visited[i] == false && isCyclicUtil(i,visited,recursionStack) == true) {
  186.                  delete[] visited;
  187.                  delete[] recursionStack;
  188.                  return true;
  189.             }
  190.         }
  191.         delete[] visited;
  192.         delete[] recursionStack;
  193.         return false;
  194.         // Student answer
  195.     }
  196.     void DFSHelp(int v,bool* visited, stack<int>& result){
  197.         visited[v] = true;
  198.         for (int i = 0; i < adj[v].getSize(); ++i){
  199.             int index = adj[v].getElement(i);
  200.             if (visited[index] == false) DFSHelp(index,visited,result);
  201.         }
  202.         result.push(v);
  203.         return;
  204.     }
  205.     void topologicalSort(){
  206.         if (isCyclic() == true){
  207.             return;
  208.         }
  209.         stack<int> result;
  210.         bool* visited = new bool[V];
  211.         for (int i = 0; i < V; ++i) visited[i] = false;
  212.         for (int i = 0; i < V; ++i){
  213.             if (visited[i] == false) DFSHelp(i,visited,result);
  214.         }
  215.         while (!result.empty()){
  216.             cout << result.top() << " ";
  217.             result.pop();
  218.         }
  219.     }
  220. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement