Advertisement
Guest User

Prima-dijkstra

a guest
Nov 29th, 2012
230
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.20 KB | None | 0 0
  1. /* przyklad:
  2.  
  3. 6 10
  4. 1 2 2
  5. 1 6 1
  6. 1 5 3
  7. 4 1 5
  8. 2 6 2
  9. 2 3 5
  10. 4 3 4
  11. 3 5 4
  12. 4 5 4
  13. 5 6 3
  14.  
  15.  
  16. */
  17.  
  18. #include <iostream>
  19. #include <vector>
  20. #include <set>
  21. #include <cstdlib>
  22. using namespace std;
  23. const int INF=2333333;
  24. class graph
  25. {
  26.     public:
  27.     struct Kr
  28.     {
  29.         int to;
  30.         int cena;
  31.         Kr(int a, int b){to=a;cena=b;}
  32.     };
  33.     struct Ve
  34.     {
  35.         bool odw;
  36.             vector<Kr> kr;
  37.             int odl;
  38.             int s;
  39.             Ve(){odl=INF;odw=false;}
  40.     };
  41.     struct djcmp{
  42.         bool operator () (Ve* a, Ve* b)
  43.         {
  44.                 return a->odl<b->odl;
  45.         }
  46.     };
  47.     vector<Ve> v;
  48.     vector<Ve> v2;
  49.     graph(int a){v.assign(a,Ve());v2.assign(a,Ve());}
  50.     void add(int iOd, int iDo,int Cena)
  51.     {
  52.         v[iOd].kr.push_back(Kr(iDo,Cena));
  53.         v[iDo].kr.push_back(Kr(iOd,Cena));
  54.     }
  55. void Dijkstra()
  56.     {
  57.         set<Ve*,djcmp> kol;
  58.         v[0].odl=0;
  59.         v[0].s=-1;
  60.         REP(i,v.size())
  61.             kol.insert(&v[i]);
  62.         Ve* p;
  63.         while(!kol.empty())
  64.         {
  65.             p=*kol.begin();
  66.             p->odw=true;
  67.             cout<<"teraz przetwarzam "<<p-&v[0]<<"\n";
  68.             if(p->s!=-1){//tworze minimalne drzewo rozpinajace
  69.                 v2[p-&v[0]].kr.push_back(Kr(p->s,p->odl));
  70.                 v2[p->s].kr.push_back(Kr(p-&v[0],p->odl));
  71.             }
  72.             kol.erase(kol.begin());
  73.              REP(i,p->kr.size()){
  74.                 if(v[p->kr[i].to].odl > p->kr[i].cena && !v[p->kr[i].to].odw)
  75.                 {
  76.                     kol.erase(&v[p->kr[i].to]);//gdy jest tu pomija wierzcholek nr 2
  77.                     v[p->kr[i].to].odl = p->kr[i].cena;
  78.                     v[p->kr[i].to].s = int(p - &v[0]);
  79.                     //gdy dam tutaj erase pomija wierzchołka nr 3
  80.                     kol.insert(&v[p->kr[i].to]);
  81.                 }
  82.             }
  83.         }
  84.     }
  85. };
  86. int main()
  87. {
  88.     int n,m;
  89.     cin>>n>>m;
  90.     graph g(n);
  91.     int a,b,c;
  92.     REP(i,m)
  93.     {
  94.         cin>>a>>b>>c;
  95.         g.add(a-1,b-1,c);
  96.     }
  97.     g.Dijkstra();
  98.    for(int i=0; i < n; i++)
  99.     {
  100.         cout<<"ilosc krawedzi dla "<<i<<" to "<<g.v2[i].kr.size()<<"\n";
  101.     }
  102.     return 0;
  103. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement