0 / 0 / 0
Регистрация: 28.11.2012
Сообщений: 27
1

алгоритм Краскала си реализация

28.04.2013, 15:33. Показов 8738. Ответов 0
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Понимаю, вопрос очень глупый и это уже все давно размусолено в инете, НО до меня никак не допрет, что подается на вход программе, реализующей этот алгоритм:
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
 
typedef struct 
{
    int from;       // Начальная вершина края
    int to;         // край концевой вершины
    double w;       // вес ребра
} edge_t;   
 
typedef struct set_t 
{
    struct set_t *p; // ссылка на родителя
} set_t;
 
 
int NS;      // количество наборов
set_t *sets; // Массив наборов
int NE;      // Число ребер
edge_t *E;   // массив ребер
int NV;      // Число ребер
 
//Функция сравнения для сортировки края по весу
int cmpw(edge_t *a, edge_t *b)
{
    if(a->w > b->w ) return 1;
    if(a->w < b->w ) return -1;
    return 0;
}   
 
set_t*
get_set_id(set_t* s)
{
    if(s == s->p )
       return s;
    else 
    {
       set_t *p = get_set_id(s->p);
       s->p = p; 
       return p;
    }    
}
 
set_t*
join_sets(set_t *a, set_t *b)
{
    a->p = b;
    return a;
}   
 
 
void take_edge(int edge_id)
{
    printf("%d %d %lf\n", E[edge_id].from, E[edge_id].to, E[edge_id].w);
}   
 
int main(void)
{
    int i;
    double W = 0;
    scanf("%d%d", &NV, &NE);
    E = (edge_t*) malloc(NE * sizeof(edge_t));
    sets = (set_t*) malloc(NV * sizeof(set_t));
    for(i = 0; i < NE ; i++)
    {
       scanf("%d%d%lf", &E[i].from, &E[i].to, &E[i].w);
    } 
    
    // Сортировка ребра по весу
    qsort(E, NE, sizeof(edge_t), (int (*)(const void*, const void*)) cmpw);
 
    NS = NV;
    for(i = 0; i < NS ; i++)
       sets[i].p = &sets[i];
    
    for(i=0; NS > 1 && i < NE; i++)       
    {
       if ( get_set_id ( &sets[E[i].from]) == get_set_id ( &sets[E[i].to]) )
                continue;
 
       join_sets ( get_set_id (&sets[E[i].from] ), get_set_id ( &sets[E[i].to]) );
       NS--;
       take_edge(i);
       W += E[i].w;
    }
 
    if(NS != 1)
       fprintf(stderr, "ошибка: Граф не соединен.\n");
    printf("Covering tree weight = %lf\n", W);
    system("pause");
    return 0;
}
Посылать в гугл не надо и тапками бросаться тоже. Просто поясните, какие входные данные идут на вход) Остальное, как ни странно, все понятно.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.04.2013, 15:33
Ответы с готовыми решениями:

Алгоритм Краскала
namespace GraphMethods { using System; using System.Collections.Generic; using...

Алгоритм Краскала
Здравствуйте. Передо мной стоит задача реализовать алгоритм Краскала в C++ Builder. Интерфейсная...

Алгоритм Краскала
Народ, кто-нибудь может на естественном языке пояснить суть алгоритма Краскала? Я чето не понял,...

Алгоритм Краскала
Можете указать,в чем ошибка в данном коде,почему при вводе данных он выдает ошибку if Comp !=...

0
28.04.2013, 15:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.04.2013, 15:33
Помогаю со студенческими работами здесь

Реализовать алгоритм Краскала
Добрый день, друзьяшки. Помогите пожалуйста, кому не будет трудным :) Препод дал такое задание: ...

Реализовать Алгоритм Краскала
Нужно исправить код. Ошибки. Какой код лучше подойдёт? #include &lt;iostream&gt; #include &lt;vector&gt;...

Алгоритм Прима-Краскала
Вот код, подскажите пожалуйста, какой вопрос вводить для выдачи результата? путь(X,Z,Граф,Res):- ...

Ошибка в коде - алгоритм Краскала
Добрый день. Есть код, все вполне прилично. Но минимальное остовное дерево находит неправильно,...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru