Advertisement
Guest User

Untitled

a guest
Oct 9th, 2015
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.80 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <map>
  4. #include <set>
  5. #include <string>
  6. #include <queue>
  7. #include <list>
  8. #include <cmath>
  9.  
  10.  
  11. using namespace std;
  12. class vertex;
  13.  
  14. class edge{
  15. public:
  16.     vertex* from, *to;
  17.     float dist;
  18.  
  19.     edge(vertex *f, vertex *t, float d) : from(f), to(t), dist(d) {};
  20.  
  21.     vertex* getOposite(vertex* v){
  22.         if(from == v) return to;
  23.         if(to == v) return from;
  24.         return 0;
  25.     }
  26. };
  27.  
  28. bool sortfunction (edge* p1,edge* p2) {
  29.     return  p1->dist < p2->dist;
  30. }
  31.  
  32. class vertex{
  33. public:
  34.     vector<edge*> edges;
  35.     string name;
  36.     float x;
  37.     float y;
  38.  
  39.     vertex(string n, float xova, float yova): name(n), x(xova), y(yova){};
  40.  
  41.     void sortEdges(){
  42.         sort( edges.begin(), edges.end(), sortfunction);
  43.     }
  44. };
  45.  
  46. class Graf{
  47. public:
  48.     set<vertex*> allVerteces;
  49.     map<string, vertex*> string_to_Verteces;
  50.     set<vertex*> visitedVertex;
  51.     vector<vertex*> path;
  52.     vector<edge*> allEdges;
  53.  
  54.     Graf(){};
  55.     Graf(ifstream &file){
  56.         string name;
  57.         float x;
  58.         float y;
  59.         int pom;
  60.  
  61.         while(!file.eof()){
  62.             file >> name >> pom >> pom >> x >> y;
  63.             addVertex(name, x, y);
  64.         }
  65.         addAllEdges();
  66.     }
  67.  
  68.     void addVertex(string name, float x, float y){
  69.         if( string_to_Verteces.find(name) == string_to_Verteces.end() )
  70.         {
  71.             vertex *nova = new vertex(name, x, y);
  72.             string_to_Verteces[name] = nova;
  73.             allVerteces.insert(nova);
  74.         }
  75.     }
  76.  
  77.  
  78.     void addAllEdges(){
  79.         set<vertex*>::iterator pit;
  80.         set<vertex*>::iterator dit;
  81.         for(pit = allVerteces.begin(); pit!= allVerteces.end(); ++pit){
  82.             for(dit = allVerteces.begin(); dit!= allVerteces.end(); ++dit){
  83.                 if(*pit != *dit){
  84.                     vertex* pfrom = *pit;
  85.                     vertex* pto = *dit;
  86.  
  87.                     float xova,yova;
  88.  
  89.                     xova = pfrom->x - pto->x;
  90.                     yova = pfrom->y - pto->y;
  91.                     float dlzka = sqrt( xova*xova + yova*yova );
  92.  
  93.                     edge* hrana = new edge(pfrom,pto,dlzka);
  94.                     pfrom->edges.push_back(hrana);
  95.  
  96.                     allEdges.push_back(hrana);
  97.                 }
  98.             }
  99.         }
  100.         sortAllEdges();
  101.     }
  102.  
  103.     void sortAllEdges(){
  104.         set<vertex*>::iterator pit;
  105.         for(pit = allVerteces.begin(); pit!= allVerteces.end(); ++pit){
  106.             (*pit)->sortEdges();
  107.         }
  108.     }
  109.  
  110.     void najblizsie(int pocet){
  111.         set<vertex*>::iterator pit;
  112.         vector<edge*>::iterator eit;
  113.  
  114.         for(pit = allVerteces.begin(); pit!= allVerteces.end(); ++pit){
  115.             int cyklus = 0;
  116.  
  117.             cout << (*pit)->name << " >> \t|";
  118.  
  119.             for(eit = (*pit)->edges.begin(); eit != (*pit)->edges.end(); ++eit){
  120.                 if(pocet> cyklus){
  121.                     cout << (*eit)->to->name << " dist \t" << (*eit)->dist << " \t| ";
  122.                     cyklus++;
  123.                 }
  124.             }          
  125.  
  126.  
  127.             cout << endl;
  128.         }
  129.     }
  130.  
  131.  
  132.     void doDFS(vertex* temp, list<vertex*> *vrcholy){
  133.         vector<edge*>::iterator it;
  134.         //cout << temp->name << " ";
  135.         vertex *help = temp;
  136.         visitedVertex.insert(temp);
  137.         list<vertex*>::iterator findIter = find((*vrcholy).begin(), (*vrcholy).end(), temp);
  138.  
  139.         for(it=help->edges.begin(); it != help->edges.end(); it++){
  140.             vertex* hr = (*it)->getOposite(help);
  141.             if(visitedVertex.find(hr) == visitedVertex.end()){
  142.                 doDFS(hr, vrcholy);
  143.             }
  144.         }
  145.         vrcholy->erase(findIter);
  146.     }
  147.  
  148.     int suvislost(){
  149.         list<vertex *> vrcholy;
  150.         set<vertex *>::iterator vit;
  151.         int pocet = 0;
  152.         visitedVertex.clear();
  153.  
  154.         for(vit= allVerteces.begin(); vit!=allVerteces.end(); ++vit){
  155.             vrcholy.push_back(*vit);
  156.         }
  157.  
  158.         while(!vrcholy.empty()){
  159.             doDFS(vrcholy.front(), &vrcholy);
  160.             pocet++;
  161.         }
  162.         return pocet;
  163.     }
  164.  
  165.     void addEdgeToVertex(vertex * from, vertex *to, float dist){
  166.         set<vertex*>::iterator it;
  167.         edge *novy = new edge(from, to, dist);
  168.         for(it = allVerteces.begin(); it!= allVerteces.end(); ++it){
  169.             if(((*it)->name == from->name) || ((*it)->name == to->name) ){
  170.                 (*it)->edges.push_back(novy);
  171.             }
  172.         }
  173.     }
  174.  
  175.  
  176.     void Kruskal(Graf &G1){
  177.         set<vertex*> vsetkyDocVrcholy;
  178.         vector<edge*> vsetckyDocHrany;
  179.         set<vertex*>::iterator it;
  180.         vector<edge*>::iterator edgit;
  181.  
  182.         copy(
  183.             G1.allVerteces.begin(), G1.allVerteces.end(),
  184.             std::inserter( allVerteces, allVerteces.begin() ) );
  185.         copy(
  186.             G1.allEdges.begin(), G1.allEdges.end(),
  187.             std::inserter( vsetckyDocHrany, vsetckyDocHrany.begin() ) );
  188.         copy(
  189.             G1.string_to_Verteces.begin(), G1.string_to_Verteces.end(),
  190.             std::inserter( string_to_Verteces, string_to_Verteces.begin() ) );
  191.  
  192.         for(it=allVerteces.begin(); it != allVerteces.end(); ++it){
  193.             (*it)->edges.clear();
  194.         }
  195.  
  196.         for(edgit = vsetckyDocHrany.begin(); edgit != vsetckyDocHrany.end(); ++edgit){
  197.             if(suvislost()==1)
  198.                 break;
  199.             else{
  200.                 allEdges.push_back(*edgit);
  201.                 addEdgeToVertex( (*edgit)->from, (*edgit)->to, (*edgit)->dist);
  202.             }
  203.         }
  204.     }
  205.  
  206.     void dosirky(string name){
  207.         if( string_to_Verteces.find(name) != string_to_Verteces.end() )
  208.             Breadth_first_search(string_to_Verteces[name]);
  209.     }
  210.  
  211.    
  212.     void Breadth_first_search(vertex* temp){
  213.         queue<vertex *> fronta;
  214.         vertex* vrchol = temp;
  215.         vector<edge*>::iterator it;
  216.         int prechod = 0;
  217.  
  218.         visitedVertex.clear();
  219.  
  220.         fronta.push(vrchol);
  221.         while(!fronta.empty()){
  222.  
  223.             vrchol = fronta.front();
  224.  
  225.  
  226.             if(visitedVertex.find(vrchol) == visitedVertex.end()){
  227.                 if(prechod>8){
  228.                     cout << endl;
  229.                     prechod = 0;
  230.                 }
  231.                 prechod++;
  232.                 cout << vrchol->name << "  ";
  233.                 visitedVertex.insert(vrchol);
  234.             }
  235.  
  236.             fronta.pop();
  237.  
  238.  
  239.             for(it=vrchol->edges.begin(); it != vrchol->edges.end(); it++){
  240.                 vertex* hr = (*it)->getOposite(vrchol);
  241.                 if(visitedVertex.find(hr) == visitedVertex.end()){
  242.                     fronta.push(hr);
  243.                 }
  244.             }
  245.  
  246.         }
  247.  
  248.     }
  249.  
  250.  
  251.     void sortVsetky(){
  252.         sort( allEdges.begin(), allEdges.end(), sortfunction);
  253.     }
  254. };
  255.  
  256.  
  257.  
  258.  
  259. int main(){
  260.     ifstream stanice("suradnice.txt");
  261.     cout << "Vypis najlbizsich susedov : " << endl;
  262.     Graf G1(stanice),G2;
  263.     G1.najblizsie(3);
  264.     G2.Kruskal(G1);
  265.     cout <<endl<<endl<< "Vypis do sirky po kruskalovi : " << endl;
  266.     G2.dosirky("ACTON");
  267.     /*Vertex* stred = G2.stred();
  268.     G2.dosirky(stred.name);*/
  269.     getchar();
  270.     return 1;
  271. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement