loulett

Graph

May 19th, 2015
217
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.89 KB | None | 0 0
  1. #include <vector>
  2. #include <unordered_set>
  3. #include <iostream>
  4.  
  5. class IGraph
  6. {
  7. public:
  8.     typedef std::vector<int> TVertexCollection;
  9.     virtual void AddEdge(int from, int to) = 0;
  10.  
  11.     virtual size_t VertexCount() const = 0;
  12.  
  13.     virtual TVertexCollection GetNextVertices(int vertex) const = 0;
  14.     virtual TVertexCollection GetPreviousVertices(int vertex) const = 0;
  15.     virtual ~IGraph() {}
  16. };
  17.  
  18. class CListGraph;
  19. class CArcGraph;
  20. class CListGraph;
  21. class CMatrixGraph;
  22. class CSetGraph;
  23.  
  24. class CListGraph : public IGraph
  25. {
  26. public:
  27.     CListGraph(size_t n)
  28.     {
  29.         list.resize(n);
  30.     }
  31.  
  32.     CListGraph(const CArcGraph& g);
  33.     CListGraph(const CMatrixGraph& g);
  34.     CListGraph(const CSetGraph& g);
  35.  
  36.     void AddEdge(int from, int to) override
  37.     {
  38.         list[from].push_back(to);
  39.     }
  40.  
  41.     size_t VertexCount() const override
  42.     {
  43.         return list.size();
  44.     }
  45.  
  46.     TVertexCollection GetNextVertices(int vertex) const override
  47.     {
  48.         return list[vertex];
  49.     }
  50.  
  51.     TVertexCollection GetPreviousVertices(int vertex) const override
  52.     {
  53.         std::vector<int> ans;
  54.         for (int i = 0; i < list.size(); i++)
  55.         {
  56.             for (int j = 0; j < list[i].size(); j++)
  57.             {
  58.                 if (list[i][j] == vertex)
  59.                 {
  60.                     ans.push_back(i);
  61.                     break;
  62.                 }
  63.             }
  64.         }
  65.         return ans;
  66.     }
  67. private:
  68.     std::vector<std::vector<int>> list;
  69. };
  70.  
  71. class CMatrixGraph : public IGraph
  72. {
  73. public:
  74.     CMatrixGraph(size_t n)
  75.     {
  76.         matrix.resize(n, std::vector<int>(n));
  77.     }
  78.  
  79.     CMatrixGraph(const CArcGraph& g);
  80.     CMatrixGraph(const CListGraph& g);
  81.  
  82.     CMatrixGraph(const CSetGraph& g);
  83.     void AddEdge(int from, int to) override
  84.     {
  85.         matrix[from][to] = 1;
  86.     }
  87.  
  88.     size_t VertexCount() const override
  89.     {
  90.         return matrix.size();
  91.     }
  92.  
  93.     TVertexCollection GetNextVertices(int vertex) const override
  94.     {
  95.         std::vector<int> ans;
  96.         for (int i = 0; i < matrix.size(); i++)
  97.         {
  98.             if (matrix[vertex][i] == 1)
  99.                 ans.push_back(i);
  100.         }
  101.         return ans;
  102.     }
  103.     TVertexCollection GetPreviousVertices(int vertex) const override
  104.     {
  105.         std::vector<int> ans;
  106.         for (int i = 0; i < matrix.size(); i++)
  107.         {
  108.             if (matrix[i][vertex] == 1)
  109.                 ans.push_back(i);
  110.         }
  111.         return ans;
  112.     }
  113. private:
  114.     std::vector<std::vector<int> > matrix;
  115. };
  116.  
  117. class CSetGraph : public IGraph
  118. {
  119. public:
  120.     CSetGraph(int n)
  121.     {
  122.         list.resize(n);
  123.     }
  124.     CSetGraph(const CArcGraph& g);
  125.     CSetGraph(const CListGraph& g);
  126.     CSetGraph(CMatrixGraph g)
  127.     {
  128.         int a = g.VertexCount();
  129.         list.resize(a);
  130.         TVertexCollection next;
  131.         for (int i = 0; i < a; i++)
  132.         {
  133.             next = g.GetNextVertices(i);
  134.             for (int j = 0; j < next.size(); j++)
  135.                 list[i].insert(next[j]);
  136.         }
  137.     }
  138.     void AddEdge(int from, int to)
  139.     {
  140.         list[from].insert(to);
  141.     }
  142.     size_t VertexCount() const override
  143.     {
  144.         return list.size();
  145.     }
  146.     TVertexCollection GetNextVertices(int vertex) const override
  147.     {
  148.         TVertexCollection ans;
  149.         for (auto i = list[vertex].begin(); i != list[vertex].end(); ++i)
  150.             ans.push_back(*i);
  151.         return ans;
  152.     }
  153.     TVertexCollection GetPreviousVertices(int vertex) const override
  154.     {
  155.         TVertexCollection ans;
  156.         for (int i = 0; i < list.size(); i++)
  157.         {
  158.             auto got = list[i].find(vertex);
  159.             if (got != list[i].end())
  160.                 ans.push_back(i);
  161.         }
  162.         return ans;
  163.     }
  164. private:
  165.     std::vector<std::unordered_set<int>> list;
  166. };
  167.  
  168. class CArcGraph : public IGraph
  169. {
  170. public:
  171.     CArcGraph() {}
  172.     CArcGraph(CMatrixGraph g)
  173.     {
  174.         int a = g.VertexCount();
  175.         TVertexCollection next;
  176.         for (int i = 0; i < a; i++)
  177.         {
  178.             next = g.GetNextVertices(i);
  179.             for (int j = 0; j < next.size(); j++)
  180.             {
  181.                 list.push_back(std::make_pair(i, next[j]));
  182.             }
  183.         }
  184.     }
  185.     CArcGraph(CListGraph g)
  186.     {
  187.         int a = g.VertexCount();
  188.         TVertexCollection next;
  189.         for (int i = 0; i < a; i++)
  190.         {
  191.             next = g.GetNextVertices(i);
  192.             for (int j = 0; j < next.size(); j++)
  193.             {
  194.                 list.push_back(std::make_pair(i, next[j]));
  195.             }
  196.         }
  197.     }
  198.     CArcGraph(CSetGraph g)
  199.     {
  200.         int a = g.VertexCount();
  201.         TVertexCollection next;
  202.         for (int i = 0; i < a; i++)
  203.         {
  204.             next = g.GetNextVertices(i);
  205.             for (int j = 0; j < next.size(); j++)
  206.             {
  207.                 list.push_back(std::make_pair(i, next[j]));
  208.             }
  209.         }
  210.     }
  211.     void AddEdge(int from, int to) override
  212.     {
  213.         list.push_back(std::make_pair(from, to));
  214.     }
  215.  
  216.     size_t VertexCount() const override
  217.     {
  218.         int ans = 0;
  219.         for (int i = 0; i < list.size(); i++)
  220.         {
  221.             if (ans < list[i].first)
  222.                 ans = list[i].first;
  223.             if (ans < list[i].second)
  224.                 ans = list[i].second;
  225.         }
  226.         return ans + 1;
  227.     }
  228.  
  229.     TVertexCollection GetNextVertices(int vertex) const override
  230.     {
  231.         TVertexCollection ans;
  232.         for (int i = 0; i < list.size(); i++)
  233.         {
  234.             if (list[i].first == vertex)
  235.                 ans.push_back(list[i].second);
  236.         }
  237.         return ans;
  238.     }
  239.  
  240.     TVertexCollection GetPreviousVertices(int vertex) const override
  241.     {
  242.         TVertexCollection ans;
  243.         for (int i = 0; i < list.size(); i++)
  244.         {
  245.             if (list[i].second == vertex)
  246.                 ans.push_back(list[i].first);
  247.         }
  248.         return ans;
  249.     }
  250. private:
  251.     std::vector<std::pair<int, int>> list;
  252. };
  253.  
  254. CListGraph::CListGraph(const CArcGraph &g)
  255. {
  256.     int a = g.VertexCount();
  257.     list.resize(a);
  258.     for (int i = 0; i < a; i++)
  259.     {
  260.         list[i] = g.GetNextVertices(i);
  261.     }
  262. }
  263.  
  264. CListGraph::CListGraph(const CMatrixGraph &g)
  265. {
  266.     int a = g.VertexCount();
  267.     list.resize(a);
  268.     for (int i = 0; i < a; i++)
  269.     {
  270.         list[i] = g.GetNextVertices(i);
  271.     }
  272. }
  273.  
  274. CListGraph::CListGraph(const CSetGraph &g)
  275. {
  276.     int a = g.VertexCount();
  277.     list.resize(a);
  278.     for (int i = 0; i < a; i++)
  279.     {
  280.         list[i] = g.GetNextVertices(i);
  281.     }
  282. }
  283.  
  284.  
  285. CMatrixGraph::CMatrixGraph(const CArcGraph &g)
  286. {
  287.     int a = g.VertexCount();
  288.     matrix.resize(a, std::vector<int>(a));
  289.     TVertexCollection next;
  290.     for (int i = 0; i < a; i++)
  291.     {
  292.         next = g.GetNextVertices(i);
  293.         for (int j = 0; j < next.size(); j++)
  294.         {
  295.             matrix[i][j] = 1;
  296.         }
  297.     }
  298. }
  299.  
  300. CMatrixGraph::CMatrixGraph(const CListGraph &g)
  301. {
  302.     int a = g.VertexCount();
  303.     matrix.resize(a, std::vector<int>(a));
  304.     TVertexCollection next;
  305.     for (int i = 0; i < a; i++)
  306.     {
  307.         next = g.GetNextVertices(i);
  308.         for (int j = 0; j < next.size(); j++)
  309.         {
  310.             matrix[i][j] = 1;
  311.         }
  312.     }
  313. }
  314.  
  315. CMatrixGraph::CMatrixGraph(const CSetGraph &g)
  316. {
  317.     int a = g.VertexCount();
  318.     matrix.resize(a, std::vector<int>(a));
  319.     TVertexCollection next;
  320.     for (int i = 0; i < a; i++)
  321.     {
  322.         next = g.GetNextVertices(i);
  323.         for (int j = 0; j < next.size(); j++)
  324.         {
  325.             matrix[i][j] = 1;
  326.         }
  327.     }
  328. }
  329.  
  330.  
  331. CSetGraph::CSetGraph(const CArcGraph &g)
  332. {
  333.     int a = g.VertexCount();
  334.     list.resize(a);
  335.     TVertexCollection next;
  336.     for (int i = 0; i < a; i++)
  337.     {
  338.         next = g.GetNextVertices(i);
  339.         for (int j = 0; j < next.size(); j++)
  340.             list[i].insert(next[j]);
  341.     }
  342. }
  343.  
  344. CSetGraph::CSetGraph(const CListGraph &g)
  345. {
  346.     int a = g.VertexCount();
  347.     list.resize(a);
  348.     TVertexCollection next;
  349.     for (int i = 0; i < a; i++)
  350.     {
  351.         next = g.GetNextVertices(i);
  352.         for (int j = 0; j < next.size(); j++)
  353.             list[i].insert(next[j]);
  354.     }
  355. }
  356.  
  357. int main()
  358. {
  359.     int n = 2;
  360.     CListGraph a(n);
  361.     a.AddEdge(0, 1);
  362.     CArcGraph b(a);
  363.     CMatrixGraph c(b);
  364.     CSetGraph d(c);
  365.     return 0;
  366. }
Advertisement
Add Comment
Please, Sign In to add comment