Задача на графы, Очень срочно! |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
Задача на графы, Очень срочно! |
klik1602 |
Сообщение
#1
|
Новичок Группа: Пользователи Сообщений: 49 Пол: Женский Реальное имя: Натали Репутация: 1 |
Помогите пожалуйста!! Завтра сдавать, я в графах ни бум-бум...очень прошу!
23. На плоскости заданы 2n точек своими координатами. Найдите уравнение какой-либо прямой, делящей данное множество точек на два подмножества по n точек. |
Krjuger |
Сообщение
#2
|
Профи Группа: Пользователи Сообщений: 652 Пол: Мужской Реальное имя: Алексей Репутация: 20 |
Условие не совсем понятно.А что если некоторые точки будут лежать на искомой прямой,то к какому подмножеству они буду относиться?Как можно задачать координаты точек?(целые или вещественные числа?)И самое главное,как множество точек,которые как таковой между собой никак не связаны, относится к графам?Если есть какие то конретные предписания,как это делать,то желательно о них упомянуть.И в каком виде нужно найти уравнение прямой?Можно например, как функцию у от х ,можно как точку и угол наклона.....
|
klik1602 |
Сообщение
#3
|
Новичок Группа: Пользователи Сообщений: 49 Пол: Женский Реальное имя: Натали Репутация: 1 |
у меня только это условие и никаких пояснений( задача относиться к теме комбинаторные алгоритмы и алгоритмы на графах, которую я совсем не пониманию..
Сообщение отредактировано: klik1602 - |
Lapp |
Сообщение
#4
|
Уникум Группа: Пользователи Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
23. На плоскости заданы 2n точек своими координатами. Найдите уравнение какой-либо прямой, делящей данное множество точек на два подмножества по n точек. Допустим, координаты точек содержатся в массиве/массивах. 1. Упорядочиваем этот/эти массив/массивы по возрастанию X. 2. Если xn <> xn+1, то искомое равнение есть x = (xn + xn+1) / 2; 3. Если xn = xn+1, то.. 4. найти минимальный ненулевой угол, опирающийся на точки из данного множества (назовем его A); 5. произвести поворот системы координат на A/2 (вокруг произвольной точки). 6. Перейти к 1. Решение, правда, не имеет особого отношения к графам.. И еще: пункты 4 и 5, возможно, можно заменить на что-то попроще, немного менее детерминированное - например, поворот на случайный угол до тех пор, пока не выполнится условие в п.2. -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
klik1602 |
Сообщение
#5
|
Новичок Группа: Пользователи Сообщений: 49 Пол: Женский Реальное имя: Натали Репутация: 1 |
ммм, попробую завтра утром сделать, если успею, ночью голова не варит совсем, спасибо большое вам..
не понимаю как вот это реализовать 4. найти минимальный ненулевой угол, опирающийся на точки из данного множества (назовем его A); 5. произвести поворот системы координат на A/2 (вокруг произвольной точки). Сообщение отредактировано: klik1602 - |
Lapp |
Сообщение
#6
|
Уникум Группа: Пользователи Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
не понимаю как вот это реализовать Реализовать это можно полным перебором по всем точкам, примерно так: aMin:= Pi; Тут Angle(x,y,z) - это величина угла между лучами, проведенными из точки с номером y в точки с номерами x и z (надо написать такую функцию); Eps - просто очень малое число (скажем, 1E-7). Но для начала лучше вращать на случайный угол (см. конец моего первого мессаджа). Угол генерировать так: a:= Random*Pi; Да, и еще: если был поворот, то нужно потом применить обратое преобразование (обратный поворот) к найденной прямой. Если делался (многогратный) поворот на случайный угол, то их нужно суммировать (центром поворота лучше всего выбрать начало координат). Получается несколько громоздко, если честно.. Можно попробовать придумать что-то более элегантное )). Но геометрия будет все равно та же, я думаю. -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
TarasBer |
Сообщение
#7
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
1. Нам надо найти прямую, которая не параллельная ни одной a[i]a[j].
2. Пусть её уравнение M*x+N*y+k=0. Сортируем массив чисел M*a[i].x + N*a[i].y + k (то есть для каждой точки берём такое число, потом сортируем массив таких чисел). Получили массив b[i]. Берём c := (b[n]+b[n+1])/2 - ну то есть число из середины массива. В качестве ответа берём M*x+N*y+(k-c): ведь у ровно половины точек число M*a[i].x + N*a[i].y + k-c будет строго положительно, а у другой половины - строго отрицательно. Вот по поводу пункта 1 что я думаю. Метод взятия случайной прямой вида a:=random*2*pi; cos(a)*x + sin(a)*y = 0; с высокой вероятностью быстро найдёт ответ, если он есть. А его может не быть. Если есть совпадающие точки, то мы уже обламываемся, всё резко усложняется. Детерминированный алгоритм придумать для такого случая я вообще не могу. Если все разные. Можно тупо перебрать, да (только не по тройкам точек, а по парам). Мне это не нравится. Можно взять минимальное ненулевое dx := a[i].x-a[j].x (для этого надо отсортировать координаты x и перебрать пары соседних). Взять максимальное dy := a[i].y-a[j].y (для этого надо вычесть максимум из минимума) Взять x*2*dy - y*dx = 0 в качестве искомой прямой: ведь вектор (dx; 2*dy) не параллелен ни одному отрезку a[i],a[j], потому что его тангенс наклона вдвое превышает все возможные тангенсы наклона отрезков, соединяющих точки из набора. правка: увеличил буквы в уравнении прямой, а то тавтология Сообщение отредактировано: TarasBer - -------------------- |
klik1602 |
Сообщение
#8
|
Новичок Группа: Пользователи Сообщений: 49 Пол: Женский Реальное имя: Натали Репутация: 1 |
добрый вечер, снова возвращаюсь к этой программе, которую я так и не сдала. Большое спасибо, за предложенные алгоритмы Lapp и TarasBer, хотела бы разобраться в вашем варианте TarasBer. Я так понимаю последовательность действий такая:
1. записываем координаты точек в массивы X и Y 2. далее нужно найти прямую, Цитата которая не параллельная ни одной a[i]a[j] , вот что такое a[i]a[j] не совсем понятно, далее Цитата Пусть её уравнение M*x+N*y+k=0. , я так понимаю, М=cos(a), N=sin(a), где a:=random*2*pi;подставим всё это мы получаем значения k, которые записываем в массив b[i] ????? или я не так понимаю, помогите разобраться пожалуйста.. 3. Цитата Берём c := (b[n]+b[n+1])/2 4. Цитата В качестве ответа берём M*x+N*y+(k-c) не откажите в помощи.. |
Krjuger |
Сообщение
#9
|
Профи Группа: Пользователи Сообщений: 652 Пол: Мужской Реальное имя: Алексей Репутация: 20 |
a[i]a[j]-это 2 точки нашего исходного массива,принципи это то, что нужно чтобы задать любую прямую на плоскости(пространстве))Но так же учтите,что решение TarasBer не универсально.
Цитата Если есть совпадающие точки, то мы уже обламываемся, всё резко усложняется Сообщение отредактировано: Krjuger - |
Lapp |
Сообщение
#10
|
Уникум Группа: Пользователи Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
Я думаю, что в условии должно быть требование, что никакие две точки не слвпадают, иначе задача просто нерешаема.
a[i] и a[j] - две точки. a[i]a[j] - прямая, проходящая через a[i] и a[j] -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
klik1602 |
Сообщение
#11
|
Новичок Группа: Пользователи Сообщений: 49 Пол: Женский Реальное имя: Натали Репутация: 1 |
Цитата
Пусть её уравнение M*x+N*y+k=0. , я так понимаю, М=cos(a), N=sin(a), где a:=random*2*pi; подставим всё это мы получаем значения k, которые записываем в массив b[i] - так значит вот этот пункт верный? |
Krjuger |
Сообщение
#12
|
Профи Группа: Пользователи Сообщений: 652 Пол: Мужской Реальное имя: Алексей Репутация: 20 |
Цитата я так понимаю, М=cos(a), N=sin(a), где a:=random*2*pi; Не совсем,смотрите его тождества. Цитата cos(a)*x + sin(a)*y = 0; M*x+N*y+k=0 Если к равно 0,то да будет так,как вы написали,а так все не так просто получается. Цитата Я думаю, что в условии должно быть требование, что никакие две точки не слвпадают, иначе задача просто нерешаема. Почему не решаема??Мне кажется она усхожнится,возможно в разы,но будет решаема,первое,что я вижу,это появится зависимость от того сколько точек в 1 позиции,ну и соотвественно усложнятся некоторые моменты,такие как c := (b[n]+b[n+1])/2 уже некоректно. А вообще у данного решения есть 1 маленький нюанс,что если уравнение прямой магическим образом по стечению обстоятельств будет проходить через нашу точку a[i],к какому множеству ее тогда причислять? Скорее всего,когда студенту дается так мало условий,он имеет право,сам сузить задачу,приведя соответствующие аргументы,почему он не рассматривает этот случай и эту возможность. Сообщение отредактировано: Krjuger - |
klik1602 |
Сообщение
#13
|
Новичок Группа: Пользователи Сообщений: 49 Пол: Женский Реальное имя: Натали Репутация: 1 |
нашла на просторах интернета похожую задачу на мою среди олимпиадных задач, к ней был приложен алгоритм решения, довольно подробно расписанный что и к чему, сейчас его пробую реализовать и вроде получается, не знаю, разрешено ли в форуме давать ссылки на другие сайты(( если можно, то я скину ссылочку, кому интересно..
|
Krjuger |
Сообщение
#14
|
Профи Группа: Пользователи Сообщений: 652 Пол: Мужской Реальное имя: Алексей Репутация: 20 |
Вы можете взять и скопировать этот алгоритм суда,если хотите,и да,здесь можно давать ссылки на сторонние ресурсы,по крайней мере,админы переодически помогают,давая ссылки на нужную информацию с сторонних ресурсов.
Сообщение отредактировано: Krjuger - |
klik1602 |
Сообщение
#15
|
Новичок Группа: Пользователи Сообщений: 49 Пол: Женский Реальное имя: Натали Репутация: 1 |
Отсортировав координаты точек в порядке неубывания Х-овых координат, а в случае одинаковых Х-овых координат в порядке неубывания У-овых координат, находим координаты средней точки (находящуюся в позиции n div 2+1), пусть это точка (Х0,У0). При этом множество точек оказалось разбито на 3 части: точки, лежащие на прямой х=Х0; точки, лежащие левее прямой х=Х0; точки, лежащие правее прямой х=Х0. Представим, что точки, лежащие левее прямой х=Х0 ( точки, лежащие правее прямой х=Х0) лежат в пределах некоторого прямоугольника, где Х1 (Х2) координаты его правого (левого) края. Тогда легко понять, что существует прямая с достаточно большим углом наклона, которая разделяет эти части. Осталось разделить только точки на прямой, чтобы количество точек в получившихся частях было соответствующим (т.е. пересечение прямой с прямой х=Х0). Если количество точек нечетно, то искомая линия проходит через среднюю точку, иначе над средней точкой (но под предыдущей, если она лежит па прямой х=Х0).
Определим: Х1 - может быть легко найдена просмотром массива Х-овых координат справа налево от средней точки до нахождения первой координаты, отличной от Х0. Если такая координата не найдена, то Х1=Х0-1. Х2 - может быть легко найдена просмотром массива Х-овых координат слева направо от средней точки до нахождения первой координаты, отличной от Х0. Если такая координата не найдена, то Х1=Х0+1. У1 - это У-овая координата точки, предшествующей средней точке, если Х-ая ее координата равна Х0, или равна У0-1, если Х-овая координата точки, предшествующей средней точке, не равна Х0. После того, как Х0,У0,Х1,У1 найдены, осталось написать уравнение прямой через точки с координатами (Х2,У2) (Х3,У3), определяемыми по следующему правилу: если N - четно то Х2=Х0; У2=(У0+У1)/2, Х3=Х0+Z/2,У3=У0-Ymax+Ymin иначе Х2=Х0; У2=У0, Х3=Х0+Z/2,У3=У0-Ymax+Ymin где Ymax- максимальная У-овая координата, Ymin - минимальная У-овая координата, Z=min(Х0-Х1,Х2-Х0). кстати я всё сделала по этому алгоритму, всё работает) но уверенности в том что правильно нету, не согласитесь его посмотреть))? Сообщение отредактировано: klik1602 - |
Lapp |
Сообщение
#16
|
Уникум Группа: Пользователи Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
но уверенности в том что правильно нету, не согласитесь его посмотреть))? И хорошо, что нет уверенности. Алгоритм неверный. Но рациональное зерно в нем есть, и он может быть довольно просто исправлен. -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
klik1602 |
Сообщение
#17
|
Новичок Группа: Пользователи Сообщений: 49 Пол: Женский Реальное имя: Натали Репутация: 1 |
Цитата он может быть довольно просто исправлен. подскажите хотя бы в каком месте ошибка, чтобы исправить. |
Krjuger |
Сообщение
#18
|
Профи Группа: Пользователи Сообщений: 652 Пол: Мужской Реальное имя: Алексей Репутация: 20 |
Ну чтобы проверить,правильно или нет,нарисуйте на бумажке пару примеров, вбейте в вашу программу и посмотрите результаты ,которые вы получили,и сравните с вашими результатами.Во вторых,выложите код того, как вы это реализовали,люди не телепаты, может быть вы доработали алгоритм под вашу задачу,а может и нет,а если и изменили,то как.
Чем отличается алгоритм от нужной вам задачи. Цитата При этом множество точек оказалось разбито на 3 части: точки, лежащие на прямой х=Х0; точки, лежащие левее прямой х=Х0; точки, лежащие правее прямой х=Х0 Для вашей задачи недопустимо,чтобы точки лежали на прямой,иначе как определять к какому множеству они будут относиться. Цитата Если количество точек нечетно, то искомая линия проходит через среднюю точку. Этот вариант тоже рассматривать не нужно,потому что у вас всегда четное количество точек. Цитата иначе над средней точкой (но под предыдущей, если она лежит па прямой х=Х0). Возможно я что то напутал или неверно понял,но это утверждение не верно(точнее оно не полное).Если надо могу привести пример. |
klik1602 |
Сообщение
#19
|
Новичок Группа: Пользователи Сообщений: 49 Пол: Женский Реальное имя: Натали Репутация: 1 |
вот код:
program L15_23; |
Текстовая версия | 11.01.2025 6:50 |