kolejka priorytetowa ze strukturą

0

Witam, mam problem z utworzeniem kolejki priorytetowej z użyciem STL gdzie każdy element to struktura. Potrzebne mi to do reprezentacji graf
mam coś takiego:

struct grf{
	int nr, waga;
};

int main(){
	int n, m, p, k, c;

	scanf("%d %d", &n, &m);//n liczba wierzcholkow, m liczba polaczen
	priority_queue <grf> *graf = new priority_queue <grf> [n];

	for(int i=0; i<m; i++){
		scanf("%d %d %d", &p, &k, &c)// poczatek krawedzi, koniec krawedzi, waga krawedzi
		graf[p].push(); // i właśnie w tym miejscu nie wiem

	}
        return 0;
}

chciałbym, aby kolejka ustawiała mi elementy w grafie w zależności od zmiennej c i najlepiej jeszcze żeby najmniejsze c było pierwsze. Da się coś takiego osiągnąć używając STL czy lepiej będzie samemu napisać sobie kopiec bo złożoność muszę mieć logarytmiczną. Dzięki z góry za pomoc

0

Chyba o to chodzi, żeby kolejka priorytetowa układała elementy wg. wybranego przez Ciebie kryterium?

http://www.cplusplus.com/reference/stl/priority_queue/

Podaj jej odpowiedni komparator i już.

Zmienna c to jak rozumiem pole waga w strukturze?

0

Niestety nie wiem, jak podaje się komparator, to dopiero mój drugi program w którym zamierzam użyć STL. Starałem się coś znaleźć o komparatorze po polsku, ale mi się nie udało, a z innymi językami to u mnie kiepsko niestety. Poza tym nie wiem jak mam dodać funkcją push cały obiekt grf który przechowuje dwie wartości i żeby sortował według jednej z nich.

0

Oto przykładowy programik z "porównywaczem" :)


#include "stdafx.h"
#include <iostream>
#include <vector>
#include <queue>

using namespace std;

struct grf
{
	grf(int p_nr, int p_waga): nr(p_nr), waga(p_waga) {}
	int nr;
	int waga;
};

class GraphComparatorLessThanClass : public binary_function<const grf&, const grf&, bool>
{
public:
	bool operator()(const grf& g1, const grf& g2)
	{
		return g1.nr < g2.nr;
	}
};

int _tmain(int argc, _TCHAR* argv[])
{
	grf g1(1,4), g2(2,3), g3(3,2), g4(4,1);

	priority_queue<grf, vector<grf>, GraphComparatorLessThanClass> grfByNrQueue;

	grfByNrQueue.push(g1);
	grfByNrQueue.push(g4);
	grfByNrQueue.push(g2);
	grfByNrQueue.push(g3);

	//wyświetl kolejkę w odwrotnej kolejności, czyli 4, 3, 2, 1
	while(!grfByNrQueue.empty())
	{
		cout<<grfByNrQueue.top().nr<<" ";
		grfByNrQueue.pop();
	}

	return 0;
}

To tak, żebyś wiedział jak ogólnie tego używać. A pod podanym wcześniej linkiem http://www.cplusplus.com/reference/stl/priority_queue/priority_queue/ masz inny przykład.

Nie bardzo rozumiem, o co chodzi z tym sortowaniem wg parametru "c". Pobierasz go w pętli, więc za każdym razem będzie on prawdopodobnie inny, więc nie wiem jak chciałbyś tego użyć jako kryterium sortowania. Chyba że "c" będzie przypisane do grf.waga i wtedy będziesz sortował po wadze każdego obiektu grf.

0

Dzięki za odpowiedź, ale to dla mnie jednak za trudne, niestety nie pisałem wcześniej w ogóle w C++, to mój drugi program dopiero. Zrobię jednak swój kopiec chyba tak jak uczono nas na C ;) Bo później będzie mi ciężko na obronie kodu. Dzięki jeszcze raz za zaangażowanie;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1