|
|
|
Задача на графы
|
|||
|---|---|---|---|
|
#18+
Дан ориентированный ациклический граф. Каждой его вершине приписан некий вес. Надо для каждой вершины найти сумму весов вершин, в которые можно попасть из данной вершины (включая в сумму и вес самой этой вершины). Пример: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Что-то не соображу как действовать. Я накарябал абсолютно верное решение, но оно медленное, а надо быстрое. Код: plaintext 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2009, 20:20:20 |
|
||
|
Задача на графы
|
|||
|---|---|---|---|
|
#18+
Форматы входа и выхода: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2009, 20:39:52 |
|
||
|
Задача на графы
|
|||
|---|---|---|---|
|
#18+
я надеялся что высокоскоростной bitset вытянет по времени, аж хренушки ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2009, 20:44:38 |
|
||
|
Задача на графы
|
|||
|---|---|---|---|
|
#18+
RT183.1 пишет: > Надо для каждой вершины найти сумму весов вершин, в которые можно попасть > из данной вершины (включая в сумму и вес самой этой вершины). Пример: Обход графа поиском в грубину (или в ширину, не помню какой даёт список достижимости из данной вершины), получаешь список достижимых вершин, потом по нему считаешь сумму весов. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2009, 21:12:48 |
|
||
|
Задача на графы
|
|||
|---|---|---|---|
|
#18+
RT183.1Эх... Не эх. А ох! Постановочки на spoj пошли какие-то простенькие. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2009, 09:46:30 |
|
||
|
Задача на графы
|
|||
|---|---|---|---|
|
#18+
maytonRT183.1Эх... Не эх. А ох! Постановочки на spoj пошли какие-то простенькие. дело не в решении самом по себе (мой код в моем первом посте всё прекрасно решает), а в быстром, максимально быстром, решении. И вот я что-то не соображу что, как и куда. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2009, 11:01:58 |
|
||
|
Задача на графы
|
|||
|---|---|---|---|
|
#18+
junior idiot, я написал генератор теста для DAGCNT2: Код: plaintext 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2009, 16:14:04 |
|
||
|
Задача на графы
|
|||
|---|---|---|---|
|
#18+
RT183.1, Да, я уже тоже свой код на рандомном графе гонял. Никакие более или менее общие алгоритмы замыкания графа у меня даже близко к нужному времени подогнать не получилось. Более того, вот этот цикл Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2009, 16:21:45 |
|
||
|
Задача на графы
|
|||
|---|---|---|---|
|
#18+
> Никакие более или менее общие алгоритмы замыкания графа у меня даже близко к нужному времени ... Теперь понятно, почему Blue Mary благоразумно "игнорит" эту таску. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2009, 16:38:40 |
|
||
|
Задача на графы
|
|||
|---|---|---|---|
|
#18+
junior idiot, долго (на самом деле бесконечно) считало из-за дичайших непоняток. Цикл while(!p.empty()) почему-то обрывается преждевременно. В b[i] я храню число ребер, исходящих из вершины i. На каждой итерации я заполняю вектор "p" вершинами, из которых (уже) ничего не исходит (а только входит). Код: plaintext 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. 94. Входной файл: Код: plaintext 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. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. И вот такой дурацкий выход: Код: plaintext 1. 2. Я ничего не понимаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2009, 21:01:50 |
|
||
|
Задача на графы
|
|||
|---|---|---|---|
|
#18+
RT183.1, Полагаю, это из-за петель в рандомном тестовом наборе. Вот так будет если петли убрать: Код: plaintext 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. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. И вот такой выход у меня получается: Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2009, 21:23:49 |
|
||
|
Задача на графы
|
|||
|---|---|---|---|
|
#18+
Точно! У меня ошибка на ошибке: этот граф-то с циклами и мой генератор теста кривой ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2009, 22:16:19 |
|
||
|
Задача на графы
|
|||
|---|---|---|---|
|
#18+
junior idiot, а как по скорости на 20000 вершинах? Можно без блока вывода. По-прежнему совсем плохо? У меня пока нет под рукой хорошего графа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2009, 22:19:35 |
|
||
|
Задача на графы
|
|||
|---|---|---|---|
|
#18+
junior idiotИ вот такой выход у меня получается: Код: plaintext а у меня такой:............... Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2009, 22:41:49 |
|
||
|
Задача на графы
|
|||
|---|---|---|---|
|
#18+
Ну вот, значит я еще и в реализации где-то напортачил пока пытался наоптимизировать. А из тестов без циклов у меня есть только 2000 вершин и 22000 ребер, на них твой код отработал за 0.4 секунды из которых 0.3 ушло на вычисление ответов (на очень слабеньком нетбуке), что весьма круто, по-моему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2009, 23:04:19 |
|
||
|
Задача на графы
|
|||
|---|---|---|---|
|
#18+
junior idiotНу вот, значит я еще и в реализации где-то напортачил пока пытался наоптимизировать. А из тестов без циклов у меня есть только 2000 вершин и 22000 ребер, на них твой код отработал за 0.4 секунды из которых 0.3 ушло на вычисление ответов (на очень слабеньком нетбуке), что весьма круто, по-моему. А вообще-то бред я написал, раз у меня ошибка, то и циклы в тесте есть, потому и отрабатывает быстро ("sch = 71")... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2009, 23:05:51 |
|
||
|
Задача на графы
|
|||
|---|---|---|---|
|
#18+
Вот правильная генерилка тестов гарантирующая отсутствие циклов. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2009, 09:42:46 |
|
||
|
Задача на графы
|
|||
|---|---|---|---|
|
#18+
defrager, йес, это без циклов. Я даже навсякий проверил Питоном: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Но теперь мой код в спойлере вообще не работает... Код: plaintext 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. Выдает: Код: plaintext 1. 2. 3. Счетчик sch = 0, как будто в этом графе нет ни одной вершины без исходящего ребра и вектор "р" пустой Я нихера не понимаю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2009, 11:05:47 |
|
||
|
Задача на графы
|
|||
|---|---|---|---|
|
#18+
> Я нихера не понимаю Разгадка оказалась простой: генерилка by defrager иногда генерит ребра вида (343 343) Я вообще-то считал это за цикл. Но неважно, -- я вставил в код игнор таких глупых ребер. И такие результаты для графа 20000/500000: Код: plaintext 1. 2. 3. 4. В принципе неплохо, но для споджа надо в 2-3-4 раза быстрее. Как и писал junior idiot почти всё время уходит на последний блок -- подсчета сумм. Код: plaintext 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. 94. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2009, 12:52:13 |
|
||
|
Задача на графы
|
|||
|---|---|---|---|
|
#18+
Смотри пример в задаче - у них тоже есть такие ребра, поэтому лучше их не выбрасывать и тестировать с ними. Что б получить accepted надо полностью менять алгоритм. Если уж делать z[d[v][j]] |= z[v]; То надо быть полностью увереным что z[v] собрало всех своих чайлдов. Думай в сторону dfs ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2009, 15:35:29 |
|
||
|
Задача на графы
|
|||
|---|---|---|---|
|
#18+
> поэтому лучше их не выбрасывать Я их не выбрасываю (в моих тестах они как были так там и остаются) -- я их просто игнорю при чтении инпута 2. Буду думать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2009, 16:33:40 |
|
||
|
Задача на графы
|
|||
|---|---|---|---|
|
#18+
> Если уж делать z[d[v][j]] |= z[v]; > То надо быть полностью увереным что z[v] собрало всех своих чайлдов. В том-то и засада, что у меня по построению z[v] именно уже собрало всех своих чилдренов. На своей итерации вершина "v" накладывает свой окончательный битсет на битсеты всех своих родителей и мы навсегда забываем про эту вершину. Может это технически накладно, а алгоритмически вроде ничего. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2009, 16:50:45 |
|
||
|
Задача на графы
|
|||
|---|---|---|---|
|
#18+
Да алгоритм правильный, но его надо сильно оптимизировать а лучше переделать под dfs что б уложиться. Подумай 1. Нужно ли нам запускать z[d[v][j]] |= z[v]; для каждого ребра исходящего (или входящего как у тебя) и когда можно не запускать. Эта операция не такая уж быстрая как кажется ~ O(20005 / 32) 2. Как лучше перебирать эти ребра что б этих "|=" было наименьшее число. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2009, 22:02:40 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=36238468&tid=1344166]: |
0ms |
get settings: |
8ms |
get forum list: |
8ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
233ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
37ms |
get tp. blocked users: |
1ms |
| others: | 189ms |
| total: | 489ms |

| 0 / 0 |
