Bład przy sortowaniu structów

0

Moglibyście zerknąć na mój kod? ;)

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
int n, m, R[7004], j, x, y, x2, y2, Q1, Q2, Q3, c;
struct krawedz
{
	int a;
	int b;
	int cena;
	int poz;
	bool czy;
};
krawedz D;
vector<krawedz>T;
bool porownaj(const krawedz &luj, const krawedz &muj)
{
	return luj.cena <= muj.cena;
}
bool porownaj2(const krawedz &luj1, const krawedz &muj1)
{
	return luj1.poz <= muj1.poz;
}
int Find(int w)
{
	if (R[w] == w) return w;
	int fa = Find(R[w]);
	R[w] = fa;
	return fa;
}
void Union(int F, int G)
{
	R[F] = R[G];
}
int main()
{
	ios_base::sync_with_stdio(0);
	cin >> n >> m;
	for (int i = 1; i <= n; i++) R[i] = i;
	for (int i = 0; i < m; i++)
	{
		cin >> Q1 >> Q2 >> Q3;
		D.a = Q1;
		D.b = Q2;
		D.cena = Q3;
		D.poz = i;
		D.czy = 0;
		T.push_back(D);
	}
	sort(T.begin(), T.end(), porownaj);
	for (int i = 0; i < m; i++)
	{
		if (T[i].czy == 0 && Find(T[i].a) != Find(T[i].b))
		{
			x = Find(T[i].a);
			y = Find(T[i].b);
			T[i].czy = 1;
			j = i + 1;
			c = T[i].cena;
			while (T[j].cena == c)
			{
				x2 = Find(T[j].a);
				y2 = Find(T[j].b);
				if ((x2 == x || x2 == y) && (y2 == x || y2 == y) && (x2 != y2)) T[j].czy = 1;
				j++;
			}
			Union(T[i].a, T[i].b);
		}
	}
	sort(T.begin(), T.end(), porownaj2);
	for (int i = 0; i < m; i++)
	{
		if (T[i].czy == 1) cout << "TAK" << endl;
		else cout << "NIE" << endl;
	}

	cin.ignore();
	getchar();
	return 0;
}

Podczas wykonywania programu dla danych:
6 10
1 2 2
1 6 1
1 5 3
4 1 5
2 6 2
2 3 5
4 3 4
3 5 4
4 5 4
5 6 3

Wyskakuje błąd:
Debug Assertion Failed
Program: C:\Windows\system32\MSVCP120D.dll
File: d:\program files\visual studio ultimate\vc\include\algorithm
Line: 3014

Expression: invalid operator<

For information on how your program can cause assertion failure, see the Visual C++ documentation on asserts.

Korzystam z Visual Studio Ultimate 2013 (MSDNAA).

1

Do porównania używa się operatora <, nie <= i Twoja funkcja porównująca też taki powinna naśladować.

1
bool porownaj(const krawedz &a, const krawedz &b)
{
    return a.cena < b.cena;
}
bool porownaj2(const krawedz &a, const krawedz &b)
{
    return a.poz < b.poz;
}
2

@Archimondei To nie ma znaczenia, jeśli są równe to funkcja ma zwracać false i tyle.

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