Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.88/34: Рейтинг темы: голосов - 34, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 18.06.2020
Сообщений: 17

Система непересекающихся множеств

20.06.2020, 09:30. Показов 7758. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите пожалуйста решить эту задачу

Условие:
Напишите программу, которая будет содержать реализацию структуры данных для системы непересекающихся множеств и обрабатывать запросы следующих видов.

«RESET n» — создать систему непересекающихся множеств на элементах от 0 до n−1, причём первое множество будет состоять из одного элемента 0, второе множество — из элемента 1, третье — из элемента 2, ..., последнее — из элемента n−1. Если до этого структура данных уже содержала некоторый набор множеств, то вся информация о них утрачивается. При этом следует вывести два слова через пробел — «RESET DONE».
«JOIN a b» — объединить множества, которым принадлежат элементы a и b. Если элементы и так принадлежали одному множеству, то требуется вывести «ALREADY a b», если же действие можно успешно выполнить, то ничего выводить не следует.
«CHECK a b» — проверить, одному ли множеству принадлежат элементы a и b, и, если одному, то вывести «YES», а иначе — «NO».

Формат входных данных:
Во входных данных содержится последовательность запросов RESET, JOIN и CHECK — каждый в отдельной строке, согласно вышеописанному формату. Гарантировано, что первая строка содержит запрос RESET, а общее количество запросов RESET не превышает 5. Общее количество всех запросов не превышает 250000. Значение n в каждом запросе RESET не превышает 100000. В каждом запросе JOIN и в каждом запросе CHECK оба числа будут в диапазоне от 0 до n−1, где n — параметр последнего выполненного запроса RESET.

Формат выходных данных:
Для запросов RESET, CHECK и тех запросов JOIN, где элементы и так принадлежат одному множеству, выводить на стандартный выход (экран) соответствующий результат (в отдельной строке).

входные данные:
RESET 15
JOIN 14 10
JOIN 13 8
JOIN 0 9
JOIN 8 3
JOIN 4 1
JOIN 10 5
JOIN 8 4
CHECK 2 11
JOIN 4 1
JOIN 2 6
CHECK 9 1
JOIN 6 5
CHECK 10 5

выходные данные:
RESET DONE
NO
ALREADY 4 1
NO
YES
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.06.2020, 09:30
Ответы с готовыми решениями:

Найти подсемейство попарно непересекающихся множеств
Столкнулся с интересно задачей, никак не могу придумать, как сделать. Попрошу помощи у вас, друзья. Сама задача: Дано семейство...

Определить окружность, проходящую через k (k>=3) точек каждого из двух непересекающихся множеств
Даны два непересекающихся конечных множества точек на плоскости. Определить окружность, проходящую через k (k>=3) точек каждого из...

Поиск непересекающихся множеств
Помогите составить алгоритм по поиску непересекающихся множеств, очень надо.

20
 Аватар для Super-Hacker
342 / 114 / 37
Регистрация: 26.11.2019
Сообщений: 735
20.06.2020, 15:42
У вас есть название структуры, в чем проблема?
https://e-maxx.ru/algo/dsu
0
0 / 0 / 0
Регистрация: 18.06.2020
Сообщений: 17
20.06.2020, 15:48  [ТС]
я понимаю алгоритм но не получается написать его на с++. Буду очень благодарен если поможете написать
0
 Аватар для Super-Hacker
342 / 114 / 37
Регистрация: 26.11.2019
Сообщений: 735
20.06.2020, 18:53
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
struct dis_set
{ 
    int parent[ 1000 ] ; 
    int size[ 1000 ]; 
    void make_set(int v) 
    {
          parent[ v ]  =  v;
          size[ v ]  =  1;
    } 
 
    int find_set(int v) 
    { 
        if(v ==  parent[ v ] ) return v; 
        return parent[ v ]  =  find_set ( parent[ v ]);
    } 
 
    void merge_set(int x, int y) 
    {
        x =  find_set(x) ;
        y =  find_set(y); 
        if( x !=  y) 
        { 
            { 
                if (size[ x ]  <  size[ y ]) 
                {
                     swap (x, y);
                }
                parent[ y ]  =  x;
                size[ x ]  + =  size[ y ];
            } 
        } 
    } 
};
Добавлено через 29 секунд
А работать с этим вот так

C++
1
2
3
4
5
6
7
8
9
10
int main () 
{
    dis_set st; // создадим нашу структуру
    for (int i =  0 ; i <  1000 ; i ++ ) 
    {
          st. make_set ( i ); // создадим множество для каждого элемента(не обязательно)
    }
    st. merge_set ( 2, 28 ); // соединим множества, где есть 2 с множеством, где есть 28
    cout << st. find_set ( 1337 ); // выведем лидера множества, которое содержит 1337
}
0
0 / 0 / 0
Регистрация: 18.06.2020
Сообщений: 17
20.06.2020, 23:23  [ТС]
можешь пж готовым кодом показать, чтоб мне понятней было
0
 Аватар для Super-Hacker
342 / 114 / 37
Регистрация: 26.11.2019
Сообщений: 735
21.06.2020, 12:15
Лучший ответ Сообщение было отмечено иВаН0301 как решение

Решение

иВаН0301,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <iostream>
using namespace std;
struct dis_set
{
    int parent[ 1000 ] ;
    int size[ 1000 ];
    void make_set(int v)
    {
        parent[ v ] = v;
        size[ v ] = 1;
    }
 
    int find_set(int v)
    {
        if(v == parent[ v ] ) return v;
        return parent[ v ] = find_set ( parent[ v ]);
    }
 
    void merge_set(int x, int y)
    {
        x = find_set(x) ;
        y = find_set(y);
        if( x != y)
        {
            {
                if (size[ x ] < size[ y ])
                {
                    swap (x, y);
                }
                parent[ y ] = x;
                size[ x ] += size[ y ];
            }
        }
    }
};
int main ()
{
    dis_set st;
    string s;
    while(cin >> s)
    {
        if(s == "RESET")
        {
            int x;
            cin >> x;
            for(int i = 0; i < 1000; i++)
                st.make_set(i);
            cout << "RESET DONE" << endl;
        }
        if(s == "JOIN")
        {
            int x, y;
            cin >> x >> y;
            if(st.find_set(x) == st.find_set(y))
            {
                cout << "ALREADY " << x << ' ' << y << endl;
            }
            st.merge_set(x, y);
        }
        if(s == "CHECK")
        {
            int x, y;
            cin >> x >> y;
            if(st.find_set(x) == st.find_set(y))cout << "YES" << endl;
            else cout << "NO" << endl;
        }
 
    }
 
}
1
0 / 0 / 0
Регистрация: 18.06.2020
Сообщений: 17
21.06.2020, 14:38  [ТС]
Если вбить такие данные то программа выдает неверный ответ. Как это исправить?

RESET 12345
JOIN 6824 6334
CHECK 5705 12119
CHECK 9961 4482
JOIN 4827 11942
CHECK 3902 2259
JOIN 5076 37
CHECK 5447 7550
CHECK 1869 11538
CHECK 9894 4690
CHECK 4664 5328
CHECK 7692 6868
CHECK 778 9741
CHECK 1842 9845
JOIN 8942 9040
CHECK 3545 11460
CHECK 2661 3005
CHECK 7284 3548
CHECK 6411 7609
CHECK 1586 7376
CHECK 11323 12281
CHECK 2082 3773
CHECK 4639 4833
CHECK 1632 9930
CHECK 5021 10041
CHECK 6270 6727
CHECK 5097 3228
CHECK 9161 945
CHECK 3229 11310
CHECK 4596 1150
CHECK 5662 3430
CHECK 10383 12287
CHECK 11876 9758
CHECK 4068 685
CHECK 1655 6417
CHECK 9203 8192
CHECK 3602 4041
CHECK 11020 9374
CHECK 7323 10854
CHECK 53 4734
CHECK 3788 6900
CHECK 2548 3728
CHECK 2421 5462
CHECK 9514 10468
CHECK 5106 6590
CHECK 10453 4174
CHECK 5844 11008
CHECK 8140 3195
CHECK 9503 1587
CHECK 6618 1113
CHECK 2936 2453
CHECK 11277 8127
CHECK 11834 6038
CHECK 6191 7958
CHECK 11511 6811
CHECK 7710 11927
CHECK 6530 4886
CHECK 11499 7797
CHECK 6306 10322
CHECK 12044 3557
CHECK 2510 2600
CHECK 2343 5516
CHECK 4078 2910
CHECK 10285 11837
CHECK 9832 11412
CHECK 4844 2154
CHECK 9080 2368
CHECK 7441 4204
CHECK 9373 5715
CHECK 3934 78
CHECK 10204 184
CHECK 193 604
CHECK 3760 8071
CHECK 5769 110
CHECK 5786 8326
CHECK 7708 12010
JOIN 8600 1832
CHECK 11301 7213
CHECK 10851 4144
CHECK 5535 2161
CHECK 12044 10466
CHECK 7679 4908
CHECK 8304 4745
CHECK 2168 4474
CHECK 5613 9905
CHECK 4414 3625
CHECK 7814 12027
CHECK 7518 7487
CHECK 2668 1763
CHECK 8480 3102
CHECK 4099 4802
CHECK 1924 1543
CHECK 1836 716
CHECK 10380 5160
CHECK 4877 142
CHECK 6842 7900
CHECK 235 1925
CHECK 4667 6551
CHECK 1349 140
CHECK 9349 2125
CHECK 10121 5026
CHECK 1018 11506
CHECK 2800 10807
CHECK 9010 1926
CHECK 9576 7970
CHECK 7164 10413
CHECK 3487 4741
CHECK 5629 2625
CHECK 2617 6902
JOIN 916 3737
CHECK 8260 1264
CHECK 7981 5030
CHECK 8808 6411
CHECK 9418 2579
CHECK 1484 6317
CHECK 5233 6613
CHECK 1200 11477
CHECK 415 2303
CHECK 5108 6477
CHECK 10505 7456
CHECK 7060 648
CHECK 6072 490
CHECK 8211 2140
CHECK 8526 9357
CHECK 11524 10926
CHECK 10112 677
CHECK 11696 11585
CHECK 4565 11884
CHECK 12053 9951
CHECK 4627 6654
CHECK 2963 10187
CHECK 11635 911
CHECK 593 4675
CHECK 6511 11409
CHECK 5480 9114
CHECK 2860 1626
CHECK 9934 5053
CHECK 1637 389
CHECK 10176 1993
CHECK 3536 10548
JOIN 7510 4296
CHECK 8079 11462
CHECK 328 6098
CHECK 7727 875
CHECK 2587 1017
CHECK 11486 824
CHECK 7152 6745
CHECK 7008 2800
CHECK 11258 9699
JOIN 7605 11192
CHECK 11430 3829
CHECK 5204 5997
CHECK 8256 6467
CHECK 8213 8683
CHECK 11047 5601
CHECK 10075 4084
CHECK 11502 6287
CHECK 10318 8876
CHECK 9826 9010
CHECK 7619 12164
CHECK 9232 6704
JOIN 1539 4975
JOIN 11247 8753
CHECK 5519 2971
CHECK 5201 9200
CHECK 8519 2917
CHECK 2865 3599
CHECK 8787 9601
CHECK 2078 4758
CHECK 5565 1670
JOIN 2943 2088
CHECK 4681 5049
CHECK 8876 608
CHECK 1801 8543
JOIN 9085 498
CHECK 8438 4536
CHECK 7038 2840
CHECK 3403 11224
CHECK 2610 4944
CHECK 8010 8680
CHECK 6239 9496
CHECK 8075 10997
CHECK 8081 9603
CHECK 6705 12084
CHECK 4220 7030
CHECK 8256 5994
CHECK 1355 8137
CHECK 5496 5885
CHECK 7345 4186
CHECK 10893 9289
CHECK 1663 1107
CHECK 3958 5454
CHECK 148 1911
CHECK 11683 4213
CHECK 4513 8973
CHECK 11903 2919
CHECK 3561 2557
CHECK 1308 1282
CHECK 6923 5402
CHECK 7914 3878
CHECK 9600 11626
CHECK 6698 47
CHECK 6692 5938
CHECK 163 6234
CHECK 1515 6493
CHECK 2355 58
CHECK 3870 2772
CHECK 3039 5985
CHECK 3740 1954
CHECK 6541 8380
CHECK 10728 4765
JOIN 10008 5787
CHECK 9018 1723
JOIN 5071 7200
CHECK 11333 1071
CHECK 8480 1950
CHECK 3309 2598
CHECK 12249 10116
CHECK 8405 7864
CHECK 7619 7516
CHECK 11662 6021
CHECK 5557 8070
CHECK 4806 11596
CHECK 11962 5602
CHECK 11769 8791
CHECK 12290 11211
CHECK 2363 1054
JOIN 5131 1367
CHECK 6995 7958
JOIN 5893 7479
CHECK 5314 10866
CHECK 7462 8851
CHECK 1146 12022
CHECK 10647 3925
CHECK 2255 4098
CHECK 8103 6007
CHECK 8762 4575
CHECK 7552 6052
CHECK 4449 11885
CHECK 12175 229
CHECK 1655 2802
CHECK 4053 10016
CHECK 7224 8843
CHECK 12170 2730
CHECK 8183 3270
CHECK 9464 905
CHECK 204 1816
CHECK 10580 1988
CHECK 5992 3991
CHECK 7604 7636
CHECK 10004 992
CHECK 6936 9970
CHECK 8194 6028
CHECK 6249 7572
CHECK 943 6474
CHECK 8419 7944
CHECK 3871 7585
CHECK 11064 2609
CHECK 1164 3729
CHECK 3244 9573
CHECK 7081 5623
CHECK 11207 8779
CHECK 5764 3150
JOIN 4460 2557
JOIN 9789 9232
CHECK 3998 7950
JOIN 11672 1012
CHECK 9762 5912
CHECK 1908 4415
CHECK 4319 5204
JOIN 6355 8166
CHECK 3447 9442
CHECK 378 2376
CHECK 9220 2431
CHECK 7145 11511
CHECK 7332 6486
CHECK 3332 7534
CHECK 7783 9646
CHECK 10697 3526
CHECK 11408 11027
CHECK 11892 7185
CHECK 8850 10156
CHECK 11192 11305
CHECK 7922 681
CHECK 8627 6289
CHECK 1532 5177
CHECK 1381 2019
CHECK 8023 2237
CHECK 2327 7824
CHECK 7926 11058
CHECK 2258 5651
CHECK 2742 8941
CHECK 6089 7128
CHECK 2522 3503
CHECK 9257 1881
CHECK 2661 6253
CHECK 7933 8462
CHECK 7586 6365
CHECK 985 8360
CHECK 11495 88
CHECK 11599 7465
CHECK 11369 7328
CHECK 9252 6608
CHECK 7208 9535
CHECK 9670 10898
CHECK 7467 3755
CHECK 12129 7506
CHECK 9990 7509
CHECK 10233 5435
CHECK 1142 3340
JOIN 5538 8483
CHECK 3489 1560
CHECK 6184 2785
CHECK 865 1047
CHECK 73 9277
CHECK 1481 9152
CHECK 1233 6582
CHECK 3449 159
CHECK 10208 10380
CHECK 1851 3025
CHECK 6674 266
CHECK 4338 545
CHECK 4954 2741
CHECK 3115 10396
CHECK 7791 2599
CHECK 7240 2042
CHECK 241 8670
CHECK 12105 3523
CHECK 9916 7296
CHECK 405 1234
CHECK 2995 11736
CHECK 11784 8554
CHECK 6172 1263
CHECK 10168 7514
CHECK 8922 5973
CHECK 2144 10986
CHECK 5874 2284
CHECK 8146 10567
CHECK 8295 9815
CHECK 9487 8551
CHECK 10838 4610
CHECK 3065 3752
CHECK 233 9261
CHECK 4611 1795
CHECK 1144 170
CHECK 1520 3333
CHECK 4022 8896
CHECK 7231 5296
CHECK 6321 6479
CHECK 11863 7102
CHECK 3455 8486
CHECK 11777 4860
CHECK 10086 10861
CHECK 9761 1852
CHECK 12110 4951
CHECK 9135 5973
CHECK 9253 12074
CHECK 8153 1643
CHECK 6450 7581
CHECK 8510 1854
CHECK 10900 10573
CHECK 12008 1550
CHECK 5765 2699
CHECK 2529 7172
CHECK 4381 1131
CHECK 8805 4326
CHECK 9320 3989
CHECK 11293 9658
CHECK 2206 4603
CHECK 4352 3396
CHECK 2443 3184
CHECK 9272 11969
CHECK 9168 3684
CHECK 12045 12097
CHECK 6854 2141
CHECK 3468 5926
CHECK 3580 318
CHECK 1099 8387
CHECK 5482 4360
CHECK 10268 7152
CHECK 5259 337
CHECK 7068 7768
CHECK 9043 5192
CHECK 748 3181
CHECK 8148 10761
CHECK 3320 5137
CHECK 6750 2739
CHECK 9436 3964
CHECK 3343 3656
CHECK 2523 3735
CHECK 3251 8623
CHECK 588 4695
CHECK 2095 12259
CHECK 8976 7720
CHECK 1214 4071
CHECK 7905 5487
CHECK 10540 9217
CHECK 10797 1836
CHECK 5340 10080
CHECK 8546 7740
CHECK 8880 6752
CHECK 707 11055
CHECK 11243 4141
CHECK 3880 7051
JOIN 11455 5791
CHECK 21 742
CHECK 11372 9248
CHECK 3335 945
CHECK 5303 9550
CHECK 6316 11854
CHECK 11688 8753
CHECK 7738 7042
CHECK 7229 12244
CHECK 2660 4769
CHECK 11981 9142
CHECK 7679 6540
CHECK 7838 5600
CHECK 5006 4978
CHECK 2088 11142
CHECK 2445 3648
CHECK 6760 11001
CHECK 3134 2669
CHECK 3545 653
CHECK 2499 8838
CHECK 2378 8683
CHECK 11197 11882
CHECK 10018 8018
CHECK 11100 5076
CHECK 2677 4396
CHECK 8055 10670
CHECK 7537 2934
CHECK 11900 3822
CHECK 10809 9945
CHECK 7733 9880
CHECK 8249 2330
CHECK 6460 4987
CHECK 9618 8144
CHECK 10879 9285
CHECK 10293 12129
CHECK 8184 9561
CHECK 6741 1774
CHECK 12279 434
CHECK 11773 11780
CHECK 10737 8232
CHECK 3715 10450
CHECK 2136 3432
CHECK 8839 5907
CHECK 3351 8131
CHECK 10727 10629
CHECK 3239 3442
CHECK 10681 4718
CHECK 6134 11831
CHECK 8738 1653
CHECK 3377 3481
CHECK 12054 236
CHECK 1898 1023
CHECK 8157 8707
CHECK 3546 8346
CHECK 10471 11400
CHECK 7065 8935
CHECK 2663 1529
CHECK 4015 10221
CHECK 9467 7811
CHECK 10542 844
CHECK 4881 9099
CHECK 1570 8706
CHECK 9405 8456
CHECK 10556 7975
CHECK 3388 8044
CHECK 6272 12319
CHECK 1775 10133
CHECK 5609 5955
CHECK 893 2257
CHECK 4888 4750
CHECK 6645 7266
CHECK 6702 10913
CHECK 6645 479
CHECK 4550 4422
CHECK 4397 16
CHECK 7833 10843
CHECK 1847 11596
CHECK 2619 4380
CHECK 9462 7728
CHECK 5154 11069
CHECK 3730 6804
CHECK 1773 704
CHECK 6125 7207
CHECK 5869 7511
CHECK 698 7103
CHECK 9850 1563
CHECK 9492 9566
CHECK 6833 3132
CHECK 4512 10003
CHECK 7075 6557
CHECK 341 9273
CHECK 1353 1892
CHECK 10389 65
CHECK 2003 3736
CHECK 2244 6286
CHECK 7519 6827
CHECK 6459 6145
CHECK 10285 11548
CHECK 8290 5116
CHECK 6078 8652
CHECK 5566 6640
CHECK 5900 10314
CHECK 4495 7256
CHECK 8421 5713
JOIN 4287 3271
CHECK 10700 2138
JOIN 205 12118
CHECK 11622 12114
CHECK 10481 590
CHECK 6816 6148
CHECK 8193 7670
CHECK 4415 4026
CHECK 726 3088
CHECK 10393 414
CHECK 3848 6447
CHECK 3690 4758
CHECK 7498 12323
JOIN 11647 3879
CHECK 12254 669
CHECK 5809 1731
CHECK 11622 9385
CHECK 6339 4359
CHECK 1585 10048
CHECK 5427 3745
CHECK 4129 10599
CHECK 5244 5158
CHECK 11447 5544
JOIN 5630 9364
JOIN 6840 2503
CHECK 8764 5306
CHECK 11045 8740
CHECK 11381 4755
CHECK 3565 11932
CHECK 6646 2083
CHECK 8920 10883
CHECK 5821 8433
CHECK 10330 582
CHECK 2737 8656
CHECK 8011 7590
JOIN 4937 10935
CHECK 4712 1228
CHECK 7162 9905
CHECK 10946 7194
CHECK 839 11770
CHECK 3394 2645
CHECK 675 1927
CHECK 2480 1428
CHECK 6858 3542
CHECK 1401 7789
CHECK 8391 7824
CHECK 6376 8793
CHECK 9230 1677
CHECK 3657 7961
CHECK 11671 684
CHECK 8939 1648
CHECK 7058 821
CHECK 119 10677
CHECK 1623 8891
CHECK 841 5584
CHECK 2612 191
CHECK 5093 1107
CHECK 5227 103
CHECK 12274 10324
CHECK 12170 2693
CHECK 11909 5084
CHECK 1848 10679
CHECK 5767 3420
CHECK 704 1439
CHECK 621 10891
CHECK 5653 8197
CHECK 10252 3276
CHECK 582 5763
CHECK 9102 6366
CHECK 1973 10819
CHECK 2556 3994
CHECK 1442 9133
CHECK 2554 10827
CHECK 1297 4453
CHECK 7056 1601
CHECK 7416 5363
CHECK 10142 2459
CHECK 4343 9816
CHECK 718 113
CHECK 656 8070
CHECK 3906 11959
CHECK 8007 5507
CHECK 2144 10756
CHECK 4668 1790
CHECK 7093 8715
CHECK 7373 1198
CHECK 9183 2930
JOIN 4762 5469
CHECK 10225 5608
CHECK 10149 11062
CHECK 1917 8038
CHECK 4360 5693
CHECK 11514 8309
CHECK 6766 489
CHECK 8321 7470
CHECK 5208 8160
CHECK 4629 1259
JOIN 11 9700
CHECK 11833 3154
CHECK 8922 6738
CHECK 3975 11969
CHECK 11871 4124
CHECK 1448 3118
CHECK 4281 10698
CHECK 1826 8275
CHECK 6521 6809
CHECK 655 11430
CHECK 6379 7551
CHECK 361 3789
CHECK 2799 11434
CHECK 601 2159
CHECK 1430 12157
CHECK 4346 4074
CHECK 5246 3947
CHECK 4646 6461
CHECK 4946 5024
CHECK 2317 11772
CHECK 5936 1441
CHECK 5636 1628
CHECK 1883 6816
CHECK 4812 5230
CHECK 1866 8310
CHECK 6238 3477
CHECK 1405 4592
JOIN 10395 8235
CHECK 1032 11975
CHECK 4489 9259
CHECK 6373 8388
CHECK 2264 5927
CHECK 6300 10371
CHECK 8485 11458
CHECK 11927 2509
CHECK 146 12054
CHECK 10559 10428
CHECK 4021 10343
CHECK 10515 2270
CHECK 6878 9817
CHECK 6538 7887
CHECK 10450 5195
CHECK 12212 1164
CHECK 12258 5790
CHECK 4121 9348
CHECK 592 11094
CHECK 9551 6097
CHECK 8947 11147
CHECK 9365 613
CHECK 6495 5809
CHECK 6292 6120
CHECK 849 182
CHECK 6568 7011
CHECK 2036 5417
CHECK 9423 1048
CHECK 4235 7954
JOIN 2782 1862
CHECK 10142 2340
CHECK 9131 6558
CHECK 5831 4085
CHECK 5577 3278
CHECK 11754 3866
CHECK 8976 3293
CHECK 10555 10443
CHECK 9375 7452
CHECK 5695 8934
CHECK 1539 1903
CHECK 7262 10312
CHECK 12119 11642
CHECK 5450 7825
CHECK 11754 948
CHECK 6705 75
CHECK 7456 11738
CHECK 3380 441
CHECK 1363 3659
CHECK 8613 1088
CHECK 7679 666
CHECK 10770 3402
CHECK 11153 2872
CHECK 10563 4508
CHECK 3202 7665
CHECK 5678 8965
CHECK 11339 7908
CHECK 833 9495
CHECK 11649 10968
CHECK 5936 348
CHECK 8982 10872
CHECK 5515 10635
CHECK 8343 7137
CHECK 7603 3995
CHECK 2167 7879
CHECK 10889 1816
CHECK 5191 5906
CHECK 6748 5224
CHECK 8867 3582
CHECK 4244 11146
CHECK 6414 10505
CHECK 6300 2403
CHECK 9250 8798
CHECK 698 8661
CHECK 12273 9967
CHECK 8741 8339
CHECK 3935 566
CHECK 3873 990
CHECK 127 3454
CHECK 5646 4641
CHECK 5584 4479
CHECK 7993 249
CHECK 10041 4640
CHECK 10655 4860
CHECK 7717 5117
CHECK 10639 5548
CHECK 7633 11683
CHECK 10654 10547
CHECK 9001 12036
JOIN 10238 3904
CHECK 5299 4060
CHECK 3751 1267
CHECK 5717 5821
CHECK 1421 3187
CHECK 3328 1201
CHECK 3951 1768
CHECK 9625 8899
CHECK 10984 5829
CHECK 5695 4669
CHECK 1537 1506
CHECK 1219 4651
CHECK 3586 9338
CHECK 2397 12137
JOIN 10382 7682
CHECK 8532 893
JOIN 2943 484
CHECK 6798 1293
CHECK 8493 2545
CHECK 9314 1429
CHECK 2893 4488
CHECK 6508 6463
CHECK 6231 12245
CHECK 23 6926
CHECK 9647 4157
CHECK 5378 11777
JOIN 11156 10189
CHECK 7118 6923
CHECK 10591 11836
CHECK 7741 2306
CHECK 9360 4949
CHECK 8624 9227
CHECK 6227 11572
JOIN 7123 1941
CHECK 144 9066
CHECK 11950 4787
CHECK 7672 184
CHECK 1631 5553
CHECK 7406 1751
CHECK 2727 4348
CHECK 11838 1511
CHECK 1056 11544
CHECK 12021 12243
CHECK 9634 283
CHECK 900 1280
CHECK 4719 10426
CHECK 1440 4047
CHECK 9609 8684
CHECK 3600 10076
CHECK 4152 9515
CHECK 8660 5677
CHECK 798 6330
CHECK 2655 10137
CHECK 940 12008
CHECK 8454 9707
JOIN 154 10485
CHECK 638 6337
CHECK 5033 4792
CHECK 11857 11338
CHECK 2641 9623
CHECK 7347 11684
CHECK 1465 2667
CHECK 10615 1663
CHECK 10134 2774
CHECK 2734 2286
CHECK 4055 6504
CHECK 7739 12128
CHECK 11822 7052
CHECK 4006 1572
CHECK 6599 10357
CHECK 9102 985
JOIN 8996 6380
CHECK 4997 2993
CHECK 6767 5506
CHECK 3609 11801
CHECK 11864 12239
CHECK 10716 5830
CHECK 9564 3367
CHECK 9034 9090
CHECK 8321 3523
CHECK 5416 9692
CHECK 10432 10844
CHECK 10285 2245
CHECK 9729 10006
CHECK 3191 225
CHECK 7983 3039
CHECK 7523 10700
CHECK 250 3695
CHECK 3796 9421
CHECK 9088 10506
CHECK 5857 8266
CHECK 1810 329
CHECK 8917 10996
CHECK 8234 1707
CHECK 8239 7057
CHECK 10350 8314
CHECK 6879 5431
CHECK 3164 5676
CHECK 11967 6038
CHECK 9511 5855
CHECK 7463 5939
CHECK 9074 979
CHECK 3330 12202
CHECK 3994 1026
CHECK 5784 9156
CHECK 4798 10552
CHECK 2687 1238
CHECK 3234 2136
CHECK 10382 1771
CHECK 5589 2974
CHECK 10938 8506
CHECK 3184 3012
CHECK 5059 9574
CHECK 12196 6595
CHECK 565 1052
CHECK 8622 965
CHECK 4094 5877
CHECK 8872 7023
CHECK 5137 6831
CHECK 5673 5745
CHECK 846 6907
CHECK 3236 6966
CHECK 11876 2951
CHECK 4291 2018
CHECK 10126 3846
CHECK 2016 7872
CHECK 1157 4719
CHECK 5287 9275
CHECK 6003 2145
CHECK 8839 8326
CHECK 12001 10405
JOIN 4795 1991
CHECK 3551 5532
CHECK 2205 5692
CHECK 5005 1507
CHECK 9984 3760
CHECK 4461 6050
CHECK 9272 10790
CHECK 6388 10771
CHECK 6450 5610
CHECK 4409 5193
CHECK 5638 7935
CHECK 4538 4345
CHECK 10287 10390
CHECK 1472 7838
CHECK 6268 10679
CHECK 7516 2800
CHECK 2562 7813
CHECK 11211 617
CHECK 7186 3621
CHECK 2912 7177
CHECK 8510 1417
CHECK 820 8380
CHECK 2119 8042
CHECK 1206 10270
CHECK 7611 8833
CHECK 6354 6645
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,536
Записей в блоге: 1
21.06.2020, 14:40
иВаН0301, а ты попроще примера не мог найти?
0
 Аватар для Super-Hacker
342 / 114 / 37
Регистрация: 26.11.2019
Сообщений: 735
21.06.2020, 17:57
иВаН0301, У меня СНМ всего на 1000 максимум, увеличить размер массива до скольки хочешь
Цитата Сообщение от Super-Hacker Посмотреть сообщение
int parent[ 1000 ] ;
    int size[ 1000 ];
0
0 / 0 / 0
Регистрация: 18.06.2020
Сообщений: 17
21.06.2020, 19:32  [ТС]
Ну просто задача легкие тесты проходит, а большие нет
0
 Аватар для Super-Hacker
342 / 114 / 37
Регистрация: 26.11.2019
Сообщений: 735
21.06.2020, 23:07
иВаН0301, Ну я дже написал,
Цитата Сообщение от Super-Hacker Посмотреть сообщение
int parent[ 1000 ] ;
    int size[ 1000 ];
это замени на это
C++
1
2
int parent[ 1000000 ] ;
    int size[ 1000000 ];
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13189 / 6824 / 1822
Регистрация: 18.10.2014
Сообщений: 17,267
21.06.2020, 23:29
Цитата Сообщение от Super-Hacker Посмотреть сообщение
C++
1
2
3
4
5
int find_set(int v) 
    { 
        if(v ==  parent[ v ] ) return v; 
        return parent[ v ]  =  find_set ( parent[ v ]);
    }
Рекурсивная реализация - это слишком дорого и в общем случае неприемлемо, ибо глубина рекурсии может оказаться очень большой.

Обычно эту операцию реализуют нерекурсивно, и обычным циклическим проходом по цепочке поиска. Отказавшись от рекурсивной реализации мы теряем возможность исправить все parent[ v ] вдоль пути поиска на конечную точку поиска. Но на самом деле это и не обязательно. Достаточно эффективным является решение, которое циклически пробегает вдоль всего пути поиска и просто исправляет parent[v] на parent[parent[v]]. То есть цепочки ссылок при каждом проходе укорачиваются "примерно в два раза".
0
 Аватар для Super-Hacker
342 / 114 / 37
Регистрация: 26.11.2019
Сообщений: 735
21.06.2020, 23:34
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
if(v ==  parent[ v ] ) return v;
        return parent[ v ]  =  find_set ( parent[ v ]);
C++
1
2
while(v != parent[v])v = parent[v];
return v;
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13189 / 6824 / 1822
Регистрация: 18.10.2014
Сообщений: 17,267
21.06.2020, 23:58
Цитата Сообщение от Super-Hacker Посмотреть сообщение
C++
1
2
while(v != parent[v])v = parent[v];
return v;
Теперь получилась уже другая крайность: реализация циклическая, но такой вариант вообще не занимается "сокращением ссылок", то есть не исправляет parent[v].

Важная "прелесть" вашего исходного (рекурсивного) варианта заключается именно в том, что он не просто ищет корень дерева, он еще и исправляет ссылки вдоль пути поиска, тем самым уменьшая высоту дерева и повышая эффективность последующих операций поиска.

Именно поэтому "классическое" решение этой задачи - компромисс между этими двумя крайностями: мы циклически пробегаем по пути поиска, но в то же время "немножко" исправляем ссылки parent[v] вдоль этого пути, по принципу parent[v] = parent[parent[v]].

Что-то вроде

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int find_set(int v) 
{ 
  int next_v = parent[v];
  if (next_v == v)
    return v;
 
  do
  {
    int prev_v = v;
    v = next_v;
    next_v = parent[v];
    if (next_v == v)
      return v;
 
    parent[prev_v] = next_v;
 
  } while (true); 
}
0
 Аватар для Super-Hacker
342 / 114 / 37
Регистрация: 26.11.2019
Сообщений: 735
22.06.2020, 14:04
TheCalligrapher, Просто гениально, этим вы ничего не добились, ведь в оригинале parent[v] = find_set(v);
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13189 / 6824 / 1822
Регистрация: 18.10.2014
Сообщений: 17,267
22.06.2020, 14:23
Цитата Сообщение от Super-Hacker Посмотреть сообщение
TheCalligrapher, Просто гениально, этим вы ничего не добились, ведь в оригинале
Вы о чем вообще???

Я же ясно сказал: за дикую рекурсию parent[v] = find_set(v); - бить по рукам и больно. Как делать правильно, и почему это правильно - я подробно описал выше. Такое постепенное транзитивное замыкание, как в моем примере - все таки хрестоматийная классика программирования, а не мое изобретение.
0
 Аватар для Super-Hacker
342 / 114 / 37
Регистрация: 26.11.2019
Сообщений: 735
22.06.2020, 14:26
TheCalligrapher, Тогда сами выбирайте, O(1) (но при этом вы делаете это рекурсивно) или O(log(size)) (пацанский способ через цикл)
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13189 / 6824 / 1822
Регистрация: 18.10.2014
Сообщений: 17,267
22.06.2020, 14:49
Цитата Сообщение от Super-Hacker Посмотреть сообщение
TheCalligrapher, Тогда сами выбирайте, O(1) (но при этом вы делаете это рекурсивно) или O(log(size)) (пацанский способ через цикл)
Это откуда это вдруг взялось O(1)??? Вы шутите? Пока все пути в дереве не скомпрессировпны, никакого O(1) в вашем варианте даже отдаленно быть не может.

Ваш вариант в терминоглогии Тарьяна называется "сжатием путей" (path compression). Это имеет смысл в том случае, если поисковые запросы будут в конечном итоге сделаны "почти ко всем" элементам множества, возможно по нескольку раз. Потратив время на сжатие путей (никакое не O(1) разумеется, а намного больше) вы превратите дерево в куст, запросы к которому впоследствии будут действительно обрабатываться за O(1).

Мой вариант в терминологии Тарьяна называется "уполовиниванием путей" (path halving). Он в конечном итоге тоже скомпрессирует пути, но только те, к которым будет сделано достаточно большое количество запросов. На те пути, к которым запросов нет (или мало), он время не тратит. В этом и заключается преимущество path halving в таких ситуациях.

А уж что здесь лучше - зависит от задачи. В любом случае, ваш path compression лучше реализовывать на рекурсией, а просто двойным проходом по всему пути.
0
 Аватар для Super-Hacker
342 / 114 / 37
Регистрация: 26.11.2019
Сообщений: 735
22.06.2020, 15:04
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
просто двойным проходом по всему пути
Только это и можно считать за альтернативу, но никак не ваш вариант
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13189 / 6824 / 1822
Регистрация: 18.10.2014
Сообщений: 17,267
22.06.2020, 15:15
Цитата Сообщение от Super-Hacker Посмотреть сообщение
Только это и можно считать за альтернативу, но никак не ваш вариант
Я отменяю этот ваш комментарий (как, впрочем, и предыдущие), как полную бессмыслицу.

И ещё раз повторяю: вариантов на самом деле три - path compression, path halving и path splitting - каждый из которых может являться оптимальным в своем наборе обстоятельств.

Этот хрестоматийные азы программирования я не предлагаю здесь к обсуждению, а даю для обязательного изучения и запоминания. Пока вы не усвоите эти ценные знания, всерьез ваши рассуждения на эту тему принимать не получится.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.06.2020, 15:15
Помогаю со студенческими работами здесь

Поиск непересекающихся множеств
помогите составить алгоритм по поиску непересекающихся множеств, вообще никакой информации не могу найти.

Мощность пересечения множеств А и В(непересекающихся)
Подскажите, пожалуйста, как решить данную задачку и объясните ход логики? Условие: Даны непересекающиеся множества А и В. Мощность...

Реализовать поиск непересекающихся множеств
можно как то в этом коде реализовать Поиск непересекающихся множеств? using System; using System.Collections.Generic; using...

Поиск минимального острова с системой непересекающихся множеств
Код вроде бы рабочий, но мне нужно чтобы только одно ребро &quot;входило&quot; в одну точку( т.е с системой непересекающихся множеств) ...

Система уравнений теории множеств
Помогите пож-та решить такую систему....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru