Официальный сайт студ.городка НГТУ
Программирование и БД » нужна помощь при реализации алгоритма Прима 

#1  08.09.07 15:22

нужна помощь при реализации алгоритма Прима

делаю РГР по графам (Романенко) программа есть, но алгоритм Прима работает не правильно...он приоритеты как то не так пересчитывает, а в чём беда я не пойму никак исправить не могу(( может кто сможет помоч?!а то через неделю отчислят нафиг((

Offline

#2  09.09.07 11:14

Я
Профиль

Re: нужна помощь при реализации алгоритма Прима

Ну давай код, чтоль. Телепатов тут нету )))

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

Программирование и БД » нужна помощь при реализации алгоритма Прима 

ФутЕр:)

© Hostel Web Group, 2002-2025.   Сообщить об ошибке

Сгенерировано за 0.049 сек.
Выполнено 14 запросов.