Форум программистов, компьютерный форум, киберфорум
Алгоритмы
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/22: Рейтинг темы: голосов - 22, средняя оценка - 4.95
0 / 0 / 0
Регистрация: 06.05.2011
Сообщений: 19

Минимальный остов (каркас, остовное дерево)

08.05.2011, 16:14. Показов 4233. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Написал прогу вычисляющую длину минимального остовного дерева по алгоритму Прима, успешно сдал на школе программиста (http://acmp.ru/index.asp?main=task&id_task=142). Но там ограничение по вершинам 100, по рёбрам 6000, по весу 30000 и не нужно проверять граф на связность. Мне же нужно сдать задачу с вершинами до 300, рёбрами до 50000, весом до 10000 и проверкой на связность. Вроде всё нормально, но выдаёт неправильный ответ на 2 тесте не пойму почему!
Code
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
program spantree;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils;
const maxN=300;
var f,f1                    :text;
    d,from                  :array[1..maxN] of integer;
    mark                    :array[1..maxN] of boolean;
    a                       :array[1..maxN,1..maxN] of integer;
    n,m,i,u,v,s,k,min,r     :integer;
 
 
begin
 reset(f,'spantree.in');
 rewrite(f1,'spantree.out');
 read(f,n,m);
 for i:=1 to n do
  for v:=1 to n do a[i,v]:=-1;{заполнение матрицы смежности}
 
 for i:=1 to m do begin
   read(f,u,v,s);
   a[u,v]:=s;
   a[v,u]:=s;
 end;{считана матрица}
 close(f);
 
 for i:=2 to n do d[i]:=high(integer);
 
 while k<n do begin
 
  min:=high(integer);
  for i:=1 to n do
   if (d[i]<=min) and (not mark[i]) then begin min:=d[i]; v:=i end;
   {нахождение минимального ребра из не U в U}
   if v<>1 then r:=r+a[from[v],v];{добавление ребра в ответ и в множество U}
   if d[v]=high(integer) then begin write(f1,'-1'); close(f1); halt end;
   mark[v]:=true;{помечаем v} inc(k);
   for i:=1 to n do
    if (not mark[i]) and (a[v,i]>-1) and (a[v,i]<d[i]) then begin
     d[i]:=a[v,i];
     from[i]:=v
    end;{пробегаем соседей v и изменяем кратчайший путь до них из U}
 
 end;
  write(f1,r);
  close(f1);
end.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.05.2011, 16:14
Ответы с готовыми решениями:

Остовное дерево
Задан неориентированный граф без петель и кратных ребер. Требуется построить какое-либо остовное дерево этого графа или сообщить, что его...

Найти кратчайшее остовное дерево графа
Задача: Найти кратчайшее остовное дерево графа, в котором длины ребер равны соответствующим элементам матрицы А: 4 5 6 2 3 2 4 2 1 5...

Найти минимальное дерево-остов
Неориентированный граф G содержит 10 вершин. Расстояния между вершинами заданы таблицей 4. Найти его минимальное дерево-остов (минимальное...

17
08.05.2011, 19:35

Не по теме:

Для олимпиадных задач удобнее использовать
reset(input,'input.txt');
rewrite(output,'output.txt');
и больше не париться с файлами. Закрывать их не придется, так как это делается в finalization модуля system.

0
Эксперт С++
 Аватар для Хохол
476 / 444 / 34
Регистрация: 20.11.2009
Сообщений: 1,293
09.05.2011, 23:33
Ссылку на тестирующую систему давайте.
0
0 / 0 / 0
Регистрация: 06.05.2011
Сообщений: 19
09.05.2011, 23:41  [ТС]
Она закрыта для тех, кто не ходит в кружок
0
Эксперт С++
 Аватар для Хохол
476 / 444 / 34
Регистрация: 20.11.2009
Сообщений: 1,293
09.05.2011, 23:58
Несвязные графы потестируйте.
0
0 / 0 / 0
Регистрация: 06.05.2011
Сообщений: 19
10.05.2011, 00:07  [ТС]
Тестировал, всё верно
0
Эксперт С++
 Аватар для Хохол
476 / 444 / 34
Регистрация: 20.11.2009
Сообщений: 1,293
10.05.2011, 00:09
Пустой вывод - правильный ответ?
0
0 / 0 / 0
Регистрация: 06.05.2011
Сообщений: 19
10.05.2011, 00:13  [ТС]
Нет, несвязный граф - ответ "-1"
0
Эксперт С++
 Аватар для Хохол
476 / 444 / 34
Регистрация: 20.11.2009
Сообщений: 1,293
10.05.2011, 00:19
Короч у вас при несвязном графе выход за границы массива присходит. Ставьте range checking в настройках компилера или добавляйте директиву {$r+}.
0
0 / 0 / 0
Регистрация: 06.05.2011
Сообщений: 19
10.05.2011, 00:27  [ТС]
Эта директива отключает проверку на вхождение индекса в массив?
И в каком месте происходит выход не знаете, вроде не должно быть такого?
0
Эксперт С++
 Аватар для Хохол
476 / 444 / 34
Регистрация: 20.11.2009
Сообщений: 1,293
10.05.2011, 00:29
Наоборот, включает проверку. Дебажьте.
0
0 / 0 / 0
Регистрация: 06.05.2011
Сообщений: 19
10.05.2011, 00:35  [ТС]
Добавил проверку на вход индекса в массив и всё равно неправильный ответ!
0
Эксперт С++
 Аватар для Хохол
476 / 444 / 34
Регистрация: 20.11.2009
Сообщений: 1,293
10.05.2011, 12:59
Выкладывайте новый код.
0
0 / 0 / 0
Регистрация: 06.05.2011
Сообщений: 19
10.05.2011, 15:57  [ТС]
Code
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
const maxN=300;
var f,f1                    :text;
    d,from                  :array[1..maxN] of int64;
    mark                    :array[1..maxN] of boolean;
    a                       :array[1..maxN,1..maxN] of int64;
    n,m,s,k,min,r,i,u,v     :integer;
 
 
begin
 reset(f,'spantree.in');
 rewrite(f1,'spantree.out');
 read(f,n,m);
 for i:=1 to n do
  for v:=1 to n do a[i,v]:=-1;{заполнение матрицы смежности}
 
 for i:=1 to m do begin
   read(f,u,v,s);
   a[u,v]:=s;
   a[v,u]:=s;
 end;{считана матрица}
 close(f);
 
 for i:=2 to n do d[i]:=high(integer);
 
 while k<n do begin
 
  min:=high(integer);
  for i:=1 to n do
   if (d[i]<=min) and (not mark[i]) then begin min:=d[i]; v:=i end;
   {нахождение минимального ребра из не U в U}
   if d[v]=high(integer) then begin write(f1,'-1'); close(f1); halt end;
   {если выбрана вершина с бесконечным путём, то граф не связен}
   if (v>1) and (from[v]>0) then r:=r+a[from[v],v];{добавление ребра в ответ и в множество U}
   mark[v]:=true;{помечаем v} inc(k);
   for i:=1 to n do
    if (not mark[i]) and (a[v,i]>-1) and (a[v,i]<d[i]) then begin
     d[i]:=a[v,i];
     from[i]:=v
    end;{пробегаем соседей v и изменяем кратчайший путь до них из U}
 
 end;
  write(f1,r);
  close(f1);
end.
Поменял местами строку 31 и 33 и добавил проверку from[v]
0
Эксперт С++
 Аватар для Хохол
476 / 444 / 34
Регистрация: 20.11.2009
Сообщений: 1,293
11.05.2011, 00:30
Давайте ссылку на тестирующую систему и логинпароль в личку.

Добавлено через 7 часов 2 минуты
Сдать свою программу я смог. Что в вашей не так - не могу понять.
0
0 / 0 / 0
Регистрация: 06.05.2011
Сообщений: 19
11.05.2011, 01:01  [ТС]
Можете тогда мне скинуть свою прогу!
0
Эксперт С++
 Аватар для Хохол
476 / 444 / 34
Регистрация: 20.11.2009
Сообщений: 1,293
11.05.2011, 01:10
Алгоритм Краскала c использованием disjoint-set.
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
#include <fstream>
#include <vector>
#include <algorithm>
 
using namespace std;
 
ifstream cin ("spantree.in" );
ofstream cout("spantree.out");
 
struct edge
{
    int x, y, w;
    bool operator < (edge &a)
    {
        return w < a.w;
    }
};
 
int n, m;
int parent[1000], rnk[1000];
vector<edge> v;
 
int getSet(int x)
{
    if(parent[x] != parent[parent[x]])
        parent[x] = getSet(parent[x]);
    return parent[x];
}
 
void unite(int x, int y)
{
    x = getSet(x);
    y = getSet(y);
    if(rnk[x] > rnk[y])
        swap(x,y);
    if(rnk[x] == rnk[y])
        rnk[y]++;
    parent[x] = y;
}
 
int main()
{
    cin >> n >> m;
    for(int i = 0; i < n; i++)
        parent[i] = i;
    v.resize(m);
    for(int i = 0; i < m; i++)
    {
        cin >> v[i].x >> v[i].y >> v[i].w;
        v[i].x--, v[i].y--;
    }
    sort(v.begin(),v.end());
    int cnt = 0, ans = 0;
    for(int i = 0; i < m; i++)
        if(getSet(v[i].x) != getSet(v[i].y))
        {
            cnt++;
            ans += v[i].w;
            unite(v[i].x, v[i].y);
        }
    if(cnt < n-1)
        cout << -1;
    else
        cout << ans;
}
0
0 / 0 / 0
Регистрация: 06.05.2011
Сообщений: 19
11.05.2011, 01:12  [ТС]
Спасибо большое, хотя хотелось честно говоря разобраться всё таки.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.05.2011, 01:12
Помогаю со студенческими работами здесь

Минимальное остовное дерево PASCAL
Написал программу для нахождения минимального остовного дерева, но вместо вывода номеров тех городов, которые он посетил, выводит нули....

Найти минимальное остовное дерево
Дан полный взвешенный граф, кол-во вершин задается пользователем, вес ребер рандомный от 1 до 100. Найти минимальное остовное дерево при...

Графы (минимальный остов)
Помогите. Надо доказать утверждение: Взвешенный граф, в котором веса всех ребер попарно различны, не может иметь несколько остовов...

Минимальное остовное дерево методом Примы
Нужно написать программу чтобы она работала с 3 вариантами задач .Вот не могу понять как лучше (проще) реализовать этот метод, т е как...

Построить остовное дерево минимальной стоимости
Построить остовное дерево минимальной стоимости Правила форума, пункт 4.3. Создавайте темы с осмысленными и понятными названиями - это...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru