Непересекающиеся множества. Ошибка error C2064

104
28 октября 2021, 06:40

Пожалуйста, помогите мне, что я делаю не так?

c++
#include "pch.h"
#include <iostream>
#include <cstring> 
#include <vector> 
#include <iterator>
#include <algorithm>
#include <functional>
#define MAXV 110
#define INF 2000000000
using namespace std;
struct Edge
{
    int u, v, dist;
    Edge(int u = 0, int v = 0, int dist = 0) : u(u), v(v), dist(dist) {}
};
int dsu_get(int v) 
{
    int *p = new int[MAXV];
    return (v == p[v]) ? v : (p[v] = dsu_get(p[v]));
}
void dsu_unite(int a, int b) 
{
    int *p = new int[MAXV];
    a = dsu_get(a);
    b = dsu_get(b);
    if (rand() & 1)
        swap(a, b);
    if (a != b)
        p[a] = b;
}
int main()
{
    vector <Edge> e;
    vector <int> mstedges;
    int mas[MAXV], size[MAXV];
    int n, m;
    cin >> n;
    cin >> m;
    for (int i = 1; i <= n; i++)
    {
        mas[i] = i;
        size[i] = 1;
    }
    e.clear();
    mstedges.clear();
    Edge temp;
    for (int i = 0; i < m; i++)
    {
        cin >> temp.u >> temp.v >> temp.dist;
        e.push_back(temp);
    }
    int lt = temp.dist;
    sort(e.begin(), e.end(), lt);
    int MST1 = 0;
    for (int i = 0; i < m; i++)
    {
        if (dsu_get(e[i].u) != dsu_get(e[i].v))
        {
            dsu_unite(e[i].u, e[i].v);
            MST1 += e[i].dist;
            mstedges.push_back(i);
        }
    }
    int MST2 = INF;
    int len;
    int cnt;
    for (int i = 0; i < mstedges.size(); i++)
    {
        len = 0;
        cnt = 1;
        for (int j = 1; j <= n; j++)
        {
            mas[j] = j, size[j] = 1;
        }
        for (int j = 0; j < m; j++)
        {
            if (j == mstedges[i])
                continue;
            if (dsu_get(e[j].u) != dsu_get(e[j].v))
            {
                dsu_unite(e[j].u, e[j].v);
                len += e[j].dist;
                cnt++;
            }
            if ((cnt == n) && (len < MST2))
                MST2 = len;
        }
    }
    cout << MST1 << " " << MST2 << endl;
}
Answer 1

Добавьте после объявления struct Edge такой код:

bool operator<(const Edge&e1, const Edge&e2) {
    return e1.dist < e2.dist;
    }

и сортировка по длине заработает.

Answer 2

Вообще-то в sort нужно передавать третьим аргументом - если передавать - функтор. Вы передаете int. Понятно, что компилятор не понимает, как превратить int в вызов функции...

Чего вы хотели добиться, передавая в алгоритм сортировки это целочисленное значение?

READ ALSO
Пара векторов или вектор пар

Пара векторов или вектор пар

Что будет производительней в общем случае: вектор пар или 2 вектора, где каждый содержит свой элемент?

107
C++ в Arduino. Преобразование вывода в строку

C++ в Arduino. Преобразование вывода в строку

Есть такое код функция hexDump выводит в порт сообщенияКак лучше сделать чтобы результат ее действия возвращался единой строкой

240
Изменение класса блока в зависимости от размеров экрана

Изменение класса блока в зависимости от размеров экрана

я имею блок с классом "preview_main_button" ( <div class="preview_main_button" id="ButtonOnPreview">Перейти ко всем статьям</div> ), но я хочу, чтобы на экранах разрешение...

101