Advertisement
Guest User

Untitled

a guest
Sep 19th, 2017
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.86 KB | None | 0 0
  1. // 2010_1_4.cpp : Defines the entry point for the console application.
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include <iostream>
  6. #include <string>
  7. #include <algorithm>
  8. #include <vector>
  9. using namespace std;
  10.  
  11. class Graph
  12. {
  13.     class Edge
  14.     {
  15.         public:
  16.             int destination;
  17.             double wage;
  18.         public:
  19.             Edge(int a, double b=0): destination(a), wage(b) {}
  20.             ~Edge() {}
  21.     };
  22.  
  23.     class Node
  24.     {
  25.         public:
  26.             int number;
  27.             vector<Edge> edges;
  28.             vector<Edge>::iterator it;
  29.  
  30.         public:
  31.  
  32.             void add(Edge a)
  33.             {
  34.                 it=edges.begin();
  35.                 for(; it != edges.end(); it++)
  36.                     if(it->destination==a.destination) break;
  37.                 if(it==edges.end()) edges.push_back(a);
  38.             }
  39.  
  40.             Node(int a): number(a) {}
  41.             Node(int a, int b, double c=0): number(a)
  42.             {
  43.                 add(Edge(b, c));
  44.             }
  45.  
  46.             ~Node()
  47.             {
  48.                 for(it=edges.begin(); it != edges.end(); it++) {}
  49.                     //delete *it;
  50.                 edges.clear();
  51.             }
  52.     };
  53.  
  54.     vector<Node> graf;
  55.     vector<Node>::iterator iter_graf, iter_graf_2;
  56.  
  57.     public:
  58.         Graph(int n=0)
  59.         {
  60.             for(int i=1; i<=n; i++)
  61.                 graf.push_back(Node(i));
  62.         }
  63.  
  64.         vector<Node>::iterator find_node(int s)
  65.         {
  66.             vector<Node>::iterator help=graf.begin();
  67.  
  68.             for(; help != graf.end(); help++)
  69.                 if(help->number==s) break;
  70.  
  71.             return help;
  72.         }
  73.  
  74.         vector<Edge>::iterator find_edge(vector<Node>::iterator help, int e)
  75.         {
  76.             for(help->it=help->edges.begin(); help->it != help->edges.end(); help->it++)
  77.                 if(help->it->destination==e) break;
  78.  
  79.             return help->it;
  80.         }
  81.  
  82.         bool dodajWierzcholek(int n)
  83.         {
  84.             iter_graf=graf.begin();
  85.             for(; iter_graf != graf.end(); iter_graf++)
  86.                 if(iter_graf->number==n) break;
  87.  
  88.             if(iter_graf!=graf.end() && !graf.empty())  return false;
  89.            
  90.             graf.push_back(Node(n));
  91.            
  92.             return true;
  93.         }
  94.        
  95.         bool dodajKrawedz(int s, int e, double dlug)
  96.         {
  97.             dodajWierzcholek(s);
  98.             dodajWierzcholek(e);
  99.  
  100.             vector<Edge>::iterator helper1, helper2;
  101.             iter_graf=find_node(s);
  102.             iter_graf_2=find_node(e);
  103.             helper1=find_edge(iter_graf, e);
  104.             helper2=find_edge(iter_graf_2, s);
  105.            
  106.             if(helper1 == iter_graf->edges.end() && helper2 == iter_graf_2->edges.end())
  107.             {
  108.                 iter_graf->edges.push_back(Edge(e, dlug));
  109.                 iter_graf_2->edges.push_back(Edge(s, dlug));
  110.                 return true;
  111.             }
  112.             return false;
  113.         }
  114.  
  115.         bool usunKrawedz(int s, int e)
  116.         {
  117.             iter_graf=find_node(s);
  118.             iter_graf_2=find_node(e);
  119.  
  120.             if(iter_graf == graf.end()||iter_graf_2 == graf.end()) return false;
  121.  
  122.             vector<Edge>::iterator helper1, helper2;
  123.             helper1=find_edge(iter_graf, e);
  124.             helper2=find_edge(iter_graf_2, s);
  125.  
  126.             if(helper1 == iter_graf->edges.end()||helper2 == iter_graf_2->edges.end()) return false;
  127.             //delete *iter_graf->it;
  128.             iter_graf->edges.erase(helper1);
  129.             iter_graf_2->edges.erase(helper2);
  130.             return true;
  131.         }
  132.        
  133.         bool usunKrawedzieWierzch(int n)
  134.         {
  135.             iter_graf=find_node(n);
  136.  
  137.             if(iter_graf == graf.end()) return false;
  138.  
  139.             iter_graf->edges.clear();
  140.             return true;
  141.         }
  142.  
  143.         bool usunWierzcholek(int n)
  144.         {
  145.             iter_graf=find_node(n);
  146.  
  147.             if(iter_graf == graf.end()) return false;
  148.  
  149.             iter_graf->edges.clear();
  150.             graf.erase(iter_graf);
  151.             return true;
  152.         }
  153.  
  154.         bool dlug(double &wynik, const vector<int> &d)
  155.         {
  156.             wynik=0;
  157.             vector<Edge>::iterator helper;
  158.             for(int i=1; i<d.size(); i++)
  159.             {
  160.                 iter_graf=find_node(d[i]);
  161.  
  162.                 if(iter_graf==graf.end())
  163.                 {
  164.                     wynik=-1;
  165.                     return false;
  166.                 }
  167.  
  168.                 helper=find_edge(iter_graf, d[i-1]);
  169.  
  170.                 if(helper==iter_graf->edges.end())
  171.                 {
  172.                     wynik=-1;
  173.                     return false;
  174.                 }
  175.  
  176.                 wynik+=helper->wage;
  177.             }
  178.             return true;
  179.         }
  180.  
  181.         ~Graph()
  182.         {
  183.             //iter_graf=no
  184.         }
  185. };
  186.  
  187. int main()
  188. {
  189.     Graph moj;
  190.    
  191.     moj.dodajKrawedz(1,2,5);
  192.     moj.dodajKrawedz(2,3,4);
  193.     moj.dodajKrawedz(1,3,2);
  194.  
  195.     moj.dodajWierzcholek(4);
  196.  
  197.     vector<int> d;
  198.     d.push_back(1); d.push_back(2); d.push_back(3);
  199.     double wynik;
  200.     moj.dlug(wynik, d);
  201.     if(wynik<0) cout<<"Brak sciezki\n";
  202.     else cout<<wynik<<"\n";
  203.     moj.usunKrawedzieWierzch(3);
  204.     moj.dlug(wynik, d);
  205.     if(wynik<0) cout<<"Brak sciezki\n";
  206.     else cout<<wynik<<"\n";
  207.     system("pause");
  208.     return 0;
  209. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement