#1 08.09.07 15:22
нужна помощь при реализации алгоритма Прима
делаю РГР по графам (Романенко) программа есть, но алгоритм Прима работает не правильно...он приоритеты как то не так пересчитывает, а в чём беда я не пойму никак исправить не могу(( может кто сможет помоч?!а то через неделю отчислят нафиг((
Offline
#3 09.09.07 11:21
Re: нужна помощь при реализации алгоритма Прима
-Kleopatra- написал(а):
делаю РГР по графам (Романенко) программа есть, но алгоритм Прима работает не правильно...он приоритеты как то не так пересчитывает, а в чём беда я не пойму никак исправить не могу(( может кто сможет помоч?!а то через неделю отчислят нафиг((
В пятой строчке снизу вместо == написано =...
Я написал(а):
Ну давай код, чтоль. Телепатов тут нету )))
=)
Offline
#4 09.09.07 23:34
Re: нужна помощь при реализации алгоритма Прима
Код: cpp:
class MST { Graph<int,int> *pg; void Prim(int v); public: vector<Edge<int> > mstEdges; bool f; int mstW; int v; public: MST(Graph<int,int> *g); Graph<int,int> *GetGraph() { return pg; } }; MST::MST(Graph<int,int> *g): pg(g),f(false),mstW(0) { } void MST::Prim(int _v) { const int INF = INT_MAX; int vNum = pg->GetVertices(); PrtQueue<int> Q(vNum); vector<int> p(vNum,-1); mstEdges.clear(); mstW = 0; for (int i=0;i<vNum;i++) Q.Enq(i,INF); Q.RePrt(_v,0); while (!Q.IsEmp()) { int u; int prt; Q.Deq(u,prt); if (p[u] != -1) { int w = 0; try { mstEdges.push_back(Edge<int>(p[u],u, w=pg->GetEdgeWeight(p[u],u))); } catch(int e) {} mstW += w; } Graph<int,int>::Iterator it(pg,u); for(int v=it.Begin();!it.Off();v=it.Next()) { int w=*it; bool r=Q.IsMem(it.vertex()); if (Q.IsMem(it.vertex()) || *it<Q.GetPrt(it.vertex())) { p[v] = u; Q.RePrt(v,*it); } } if(it.Begin()==-1) return; } } bool MST::operator ()(int _v) { v = _v; if(!pg->weighted() || pg->directed()) { f = false; return f; } Prim(v); f = true; return f; }
Исправлено -Kleopatra- (09.09.07 23:36)
Offline

