Advertisement
dimon-torchila

Untitled

Jan 6th, 2023
952
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.08 KB | None | 0 0
  1. #include "bits/stdc++.h"
  2. #include "boost/bimap.hpp"
  3.  
  4. using namespace std;
  5.  
  6. namespace lab2{
  7.     class Graph{
  8.     public:
  9.         vector<bool> visited;
  10.         Graph(int size) : visited(size, false){
  11.             for(int i = 0; i < size; ++i){
  12.                 matrix.push_back(vector<int>(size,0));
  13.                 string s;
  14.                 cout << "Enter name v : ";
  15.                 cin >> s;
  16.                 ItN[i] = s;
  17.                 NtI[s] = i;
  18.             }
  19.  
  20.         }
  21.         auto First(string v){
  22.             if(!matrix[NtI[v]].empty()){
  23.                 if(NtI[v] >= matrix.size())
  24.                     throw runtime_error("going beyond the boundaries of the matrix");
  25.                 else{
  26.                     for(int i = 0; i < matrix[NtI[v]].size(); ++i){
  27.                         if(matrix[NtI[v]][i] != 0)
  28.                             return i;
  29.                     }
  30.                     return -1;
  31.                 }
  32.             } else
  33.                 throw runtime_error("height does not exist");
  34.         }
  35.  
  36.         auto Next(string v, int i){
  37.             if(!matrix[NtI[v]].empty()){
  38.                 if(i == matrix[NtI[v]].size() - 1){
  39.                     return -1;
  40.                 }
  41.                 for(int x = i + 1; i < matrix[0].size(); ++i){
  42.                     if(matrix[NtI[v]][x] != 0)
  43.                         return x;
  44.                 }
  45.                 return -1;
  46.             }
  47.             else
  48.                 throw runtime_error("height does not exist");
  49.         }
  50.  
  51.         auto Vertex(string v, int i){
  52.             if(!matrix[NtI[v]].empty()){
  53.                 if(i == 0)
  54.                     return First(v);
  55.                 int c = First(v);
  56.                 while(i != 0){
  57.                     c = Next(v, c);
  58.                     --i;
  59.                 }
  60.                 return c;
  61.             }
  62.                 else throw runtime_error("height does not exist");
  63.  
  64.         }
  65.  
  66.         auto Add_V(string v){
  67.             NtI[v] = matrix.size();
  68.             ItN[matrix.size()] = v;
  69.             matrix.push_back(vector<int>(matrix[0].size(), 0));
  70.             for(auto& x : matrix){
  71.                 if(!x.empty())
  72.                     x.push_back(0);
  73.             }
  74.         }
  75.  
  76.         auto Add_E(string v, string w, int c){
  77.             matrix[NtI[v]][NtI[w]] = c;
  78.         }
  79.  
  80.         auto Del_V(string v){
  81.             matrix[NtI[v]].clear();
  82.             for(int i = 0; i < matrix.size(); ++i){
  83.                 if(!matrix[i].empty()){
  84.                     matrix[i][NtI[v]] = 0;
  85.                 }
  86.             }
  87.             ItN.erase(NtI[v]);
  88.             NtI.erase(v);
  89.  
  90.         }
  91.  
  92.         auto Del_E(string v, string w){
  93.             matrix[NtI[v]][NtI[w]] = 0;
  94.         }
  95.  
  96.         auto Edit_V(string v, bool mark){
  97.             visited[NtI[v]] = mark;
  98.         }
  99.  
  100.         auto Edit_E(string v, string w, int c){
  101.             matrix[NtI[v]][NtI[w]] = c;
  102.         }
  103.  
  104.         auto print(){
  105.             cout << endl;
  106.             for(int i = 0; i < matrix.size(); ++i){
  107.                 if(!matrix[i].empty()) {
  108.                     for (int j = 0; j < matrix[i].size(); ++j) {
  109.                         if(ItN.contains(j))
  110.                             cout << matrix[i][j] << ' ';
  111.                     }
  112.                     cout << endl;
  113.                 }
  114.  
  115.             }
  116.         }
  117.  
  118.         int count(){
  119.             return NtI.size();
  120.         }
  121.  
  122.         void dfs(string name){
  123.             if(visited[NtI[name]])
  124.                 return;
  125.             visited[NtI[name]] = true;
  126.             cout << name << ' ';
  127.             int v = First(name);
  128.             if(v == -1)
  129.                 return;
  130.             else{
  131.                 dfs(ItN[v]);
  132.                 v = Next(name, v);
  133.                 while(v != -1){
  134.                     dfs(ItN[v]);
  135.                     v = Next(name, v);
  136.                 }
  137.                 return;
  138.             }
  139.  
  140.         }
  141.  
  142.         auto GetWeight(int i, int j) { if(i < count() && j < count()) return matrix[i][j]; else throw runtime_error("l");}
  143.  
  144.  
  145.  
  146.         void dfs(string name, vector<string>& res, long long int k, string way = "") {
  147.             if (visited[NtI[name]] || k < 0)
  148.                 return;
  149.             way += ' ' + name;
  150.             if (k == 0) {
  151.                 res.push_back(way);
  152.                 return;
  153.             }
  154.             Edit_V(name, true);
  155.             for (long long index = First(name); index != -1; index = Next(name, index)) {
  156.                 auto v = Vertex(name, index);
  157.                 dfs(ItN[v], res, k - GetWeight(NtI[name], v), way);
  158.             }
  159.             Edit_V(name, false);
  160.         }
  161.  
  162.         vector<string> get_ways( long long int k) {
  163.             vector<string> res;
  164.             for (auto& x : NtI) {
  165.                 string way = "";
  166.                 dfs(x.first, res, k, way);
  167.                 res.push_back(way);
  168.             }
  169.             return res;
  170.         }
  171.  
  172.  
  173.     private:
  174.         vector<vector<int>> matrix;
  175.         map<string, int> NtI;
  176.         map<int, string> ItN;
  177.     };
  178. }
  179.  
  180. #ifndef ALGORITHMS_LAB2_H
  181. #define ALGORITHMS_LAB2_H
  182.  
  183. #endif //ALGORITHMS_LAB2_H
  184.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement