Понимаю, вопрос очень глупый и это уже все давно размусолено в инете, НО до меня никак не допрет, что подается на вход программе, реализующей этот алгоритм:
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;
} |
|
Посылать в гугл не надо и тапками бросаться тоже. Просто поясните, какие входные данные идут на вход) Остальное, как ни странно, все понятно.