Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.83/23: Рейтинг темы: голосов - 23, средняя оценка - 4.83
33 / 27 / 2
Регистрация: 08.09.2010
Сообщений: 402
1

Графы

05.12.2010, 14:30. Показов 4706. Ответов 22
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Задача:
По системе односторонних дорог определить, есть ли в ней город, из которого можно добраться до каждого из остальных городов, проезжая не более 100 км.

Я думаю, что тут надо использовать ориентируемые графы.
Почитала литературу, и google но конкретно как описываются графы не нашла, подскажите кто что может, хоя бы с чего тут можно начать
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.12.2010, 14:30
Ответы с готовыми решениями:

Графы
1) Построить граф, используя язык С++ (или Си), согласно данной схеме на рис.1. 2) По запросу...

Графы
Задача звучит так: Задано N городов c номерами от 1 до N и сеть из M дорог с односторонним...

Графы
Помогите пожалуйста решить одну задачку. Буду очень благодарен! Спасибо заранее, огромное! ...

Графы
Люди скиньте пожалуйста какую нибудь программку на С++ по графам, или дайте ссылку на темку на...

22
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
05.12.2010, 15:39 2
поищите Димчан - С++ на примерах, там и про графы есть
1
33 / 27 / 2
Регистрация: 08.09.2010
Сообщений: 402
06.12.2010, 08:37  [ТС] 3
а можешь ссылку дать, а то не найду что-то
0
373 / 287 / 97
Регистрация: 17.12.2009
Сообщений: 567
06.12.2010, 10:52 4
ориентированный нагруженный граф.
матрицу смежности заведи и нормуль, по вертикали номера вершин - пунктов отправления, по горизонтали номера вершин пунктов прибытия, в клетках длина пути, если 0 то пути нет. Такую структуру легко обрабатывать.
0
584 / 371 / 63
Регистрация: 22.07.2009
Сообщений: 875
Записей в блоге: 4
06.12.2010, 11:42 5
Цитата Сообщение от White Luna Посмотреть сообщение
Задача:
По системе односторонних дорог определить, есть ли в ней город, из которого можно добраться до каждого из остальных городов, проезжая не более 100 км.

Я думаю, что тут надо использовать ориентируемые графы.
Почитала литературу, и google но конкретно как описываются графы не нашла, подскажите кто что может, хоя бы с чего тут можно начать
Граф описывается матрицой расстояний A[n x n], где A[i][j] - расстояние от города i до j. A[i][i] = 0;
Далее применяйте алгоритм Флойда - Фалкерсона.
Смысл которого в A[i][j] = Min(A[i][j],A[i][k]+A[k][j]) для все k.
Поле этого если в какой либо строке матрицы все элементы менее 100 - то это искомый город.
1
33 / 27 / 2
Регистрация: 08.09.2010
Сообщений: 402
07.12.2010, 15:52  [ТС] 6
эээ есть одна загвостка, мы вообще в программирование графы не изучали, и я не могу понять как они описываются на яз С++, как они же строятся на листке и в матричной форме еще как то разобралась, а вот как это перенести на яз С++ уже ?
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
07.12.2010, 15:57 7
Димчан - C++. Освой на примерах.rar
0
33 / 27 / 2
Регистрация: 08.09.2010
Сообщений: 402
07.12.2010, 16:03  [ТС] 8
Цитата Сообщение от sigmov Посмотреть сообщение
алгоритм Флойда - Фалкерсона.
.
а не знаешь где подробнее про этот алгоритм посмотреть можно?
0
584 / 371 / 63
Регистрация: 22.07.2009
Сообщений: 875
Записей в блоге: 4
07.12.2010, 16:08 9
Цитата Сообщение от White Luna Посмотреть сообщение
а не знаешь где подробнее про этот алгоритм посмотреть можно?
Мне стыдно - фамилии перепутал. Оказывается Флойда—Уоршелла.
http://ru.wikipedia.org/wiki/А... —_Уоршелла
http://e-maxx.ru/algo/floyd_warshall_algorithm
0
122 / 122 / 16
Регистрация: 18.09.2010
Сообщений: 212
07.12.2010, 16:25 10
Для поиска матрицы достижимости можно воспользоваться алгоритмом Уоррена. Я как-то делал на С# задание: поиск матрицы достижимости по заданной матрице смежности:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
for (i = 0; i < SIZE; ++i)
                for (j = 0; j < SIZE; ++j)
                    Final[i, j] = Source[i, j];
            for (i = 0; i < SIZE; i++)
                for (j = 0; j < i; j++)
                    if (Final[i,j] == 1)
                        for (k = 0; k < SIZE; k++)
                            Final[i,k] =Convert.ToInt32(Convert.ToBoolean(Final[i,k]) || Convert.ToBoolean(Final[j,k]));
            for (i = 0; i < SIZE - 1; i++)
                for (j = i + 1; j < SIZE; j++)
                    if (Final[i,j] == 1)
                        for (k = 0; k < SIZE; k++)
                            Final[i,k] =Convert.ToInt32(Convert.ToBoolean(Final[i,k]) ||Convert.ToBoolean(Final[j,k]));
Если интересует именно с++, то здесь есть разные алгоритмы по графам именно на с++:
http://khpi-iip.mipk.kharkiv.e... _0100.html
0
Эксперт С++
3224 / 1751 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
07.12.2010, 17:35 11
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
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
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
//////////////////////////////////////////////////////////////////////////////////////
//По системе односторонних дорог определить, есть ли в ней город, из которого 
//можно добраться до каждого из остальных городов, проезжая не более 100 км.
//////////////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <iostream>
#include <limits>
#include <map>
#include <set>
#include <string>
#include <vector>
//////////////////////////////////////////////////////////////////////////////////////
typedef std::string                    T_str;
typedef T_str                          T_vertice;
typedef std::set<T_vertice>            T_vertices_set;
typedef std::vector<T_vertice>         T_vertices;
typedef T_vertices                     T_arc;
typedef std::set<T_arc>                T_arcs_set;
typedef int                            T_weight;
typedef std::map<T_arc, T_weight>      T_arcs_weights;
typedef std::map<T_vertice, T_weight>  T_row;
typedef std::map<T_vertice, T_row>     T_adjacency_matr;
//////////////////////////////////////////////////////////////////////////////////////
struct T_greater_in_row
{
    T_row  row_;
    //------------------------------------------------------------------------
    T_greater_in_row(T_row  row) : row_(row)
    {}
    //------------------------------------------------------------------------
    bool operator() (T_vertice  A, T_vertice  B)                  
    {
        return row_[A] > row_[B];
    }
};
//////////////////////////////////////////////////////////////////////////////////////
void  print_matr
    (
        const T_adjacency_matr&  matr,
        const T_weight           WEIGHT_MAX,
        const T_str              INFINITY_NAME
    )
{  
    for(T_adjacency_matr::const_iterator  vert_row_it = matr.begin(); 
        vert_row_it != matr.end(); ++vert_row_it)
    {
        for(T_row::const_iterator  vert_weight_it = vert_row_it->second.begin();
            vert_weight_it != vert_row_it->second.end(); ++vert_weight_it)
        {
            if(vert_weight_it->second == WEIGHT_MAX)
            {
                std::cout << '\t'
                          << INFINITY_NAME;
            }
            else
            {
                std::cout << '\t'
                          << vert_weight_it->second;
            }
        }
        std::cout << std::endl
                  << std::endl
                  << std::endl;
    }
}
//////////////////////////////////////////////////////////////////////////////////////
T_vertices  get_vertices(const T_arcs_set&  arcs_set)
{
    T_vertices_set  vertices_set;
    for(T_arcs_set::const_iterator  arc_it = arcs_set.begin(); arc_it != arcs_set.end();
        ++ arc_it)
    {
        vertices_set.insert(*arc_it->begin());
        vertices_set.insert(*arc_it->rbegin());
    }
    return T_vertices(vertices_set.begin(), vertices_set.end()); 
}
//////////////////////////////////////////////////////////////////////////////////////
T_adjacency_matr  get_adjacency_matr
    (
        const T_vertices&      vertices, 
        const T_arcs_weights&  arcs_weights,
        const T_weight         WEIGHT_MAX
    )
{
    T_adjacency_matr  adjacency_matr;
    for(size_t  i = 0; i < vertices.size(); ++i)
    {
        for(size_t  j = 0; j < vertices.size(); ++j)
        {
            adjacency_matr[vertices[i]][vertices[j]] = WEIGHT_MAX;
        }
    }
 
    for(T_arcs_weights::const_iterator   arcs_weights_elem_it = arcs_weights.begin(); 
        arcs_weights_elem_it != arcs_weights.end(); ++arcs_weights_elem_it)
    {
        adjacency_matr
            [arcs_weights_elem_it->first.front()]
            [arcs_weights_elem_it->first.back() ] = arcs_weights_elem_it->second;
    }
    return  adjacency_matr;
}
//////////////////////////////////////////////////////////////////////////////////////
T_row  dijkstra
    (
        const T_vertice&   vertice_start,
        T_vertices         vertices,
        T_adjacency_matr&  adjacency_matr,
        const T_weight     WEIGHT_MAX
    )
{    
    T_row       weights_min_from_vert_start = adjacency_matr[vertice_start];     
    T_vertices  S;
    S.push_back     (vertice_start);
    vertices.erase  (std::find(vertices.begin(), vertices.end(), vertice_start));    
    while(!vertices.empty())
    {
        //Из элементов vertices выбираем тот, для которого значение weights_min_from_vert_start
        //минимально.
        std::make_heap(vertices.begin(), vertices.end(), 
                       T_greater_in_row(weights_min_from_vert_start));
 
        T_vertice  w = vertices.front();
 
        S.push_back     (w);
        vertices.erase  (vertices.begin());
        for(T_vertices::const_iterator  v_it = vertices.begin();
            v_it != vertices.end(); ++v_it)
        {
            T_weight&  for_w    = weights_min_from_vert_start  [w];
            T_weight&  for_v    = weights_min_from_vert_start  [*v_it];
            T_weight&  for_w_v  = adjacency_matr               [w][*v_it];
 
            if(   for_w    != WEIGHT_MAX  
               && for_w_v  != WEIGHT_MAX
               && for_w + for_w_v < for_v)
            {
                for_v = for_w + for_w_v;
            }
        }
    }
    return  weights_min_from_vert_start;
}
//////////////////////////////////////////////////////////////////////////////////////
void print_vertice_distant_not_further_than
    (
        const T_weight     max_path_weight,
        const T_vertices&  vertices,
        T_adjacency_matr&  adjacency_matr,
        const T_weight     WEIGHT_MAX
    )
{    
    for(T_vertices::const_iterator  v_it = vertices.begin();
        v_it != vertices.end(); ++v_it)
    {
        T_row  weights_min_from_v = dijkstra
                                        (
                                            *v_it,
                                            vertices,
                                            adjacency_matr,
                                            WEIGHT_MAX
                                        );
 
        T_vertices  vertices_for_v(vertices);
        std::sort(vertices_for_v.begin(), vertices_for_v.end(), 
                  T_greater_in_row(weights_min_from_v));
 
        //Удаляем первую вершину, так как это сама *v_it, расстояние до которой
        //от самой себя бесконечность.
        vertices_for_v.erase(vertices_for_v.begin());
 
        if(weights_min_from_v[vertices_for_v.front()] <= max_path_weight)
        {
            std::cout << "Город, расположенный от остальных не далее "
                      << max_path_weight 
                      << " км: "
                      << *v_it
                      << "."
                      << std::endl;
            return;
        }
 
    }
    std::cout << "В данной системе дорог нет города, "               
              << "расположенного от остальных не далее "
              << max_path_weight 
              << " км."
              << std::endl;
}
//////////////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale(""));
    int n = 0;
    do
    {
        std::cout << "Введите количество дуг ориентированного взвешенного графа > 0: ";
        std::cin >> n;
    }while(n <= 0);
 
    T_arcs_set      arcs_set;
    T_arcs_weights  arcs_weights;
    const T_weight  WEIGHT_MAX = std::numeric_limits<T_weight>::max();
    const T_str     INFINITY_NAME = "INF";
    std::cout << "Введите "
              << n
              << " дуг ориентированного взвешенного графа."
              << std::endl
              <<"Вершины в дуге не должны быть одинаковыми.";
    do
    {
        std::cout << std::endl
                  << "дуга #"
                  << arcs_set.size() + 1
                  << ":"
                  << std::endl
                  << '\t'
                  << "начало  : ";
        T_vertice  v1;
        std::cin >> v1;
        T_arc  arc_cur;
        arc_cur.push_back(v1);
        
        T_vertice  v2;
        std::cout << '\t'
                  << "конец   : ";
        std::cin >> v2;        
        arc_cur.push_back(v2);        
        if(   arc_cur.size() == 2
           && arc_cur.front() != arc_cur.back())
        {
            if(arcs_set.insert(arc_cur).second)
            {
                T_weight  arc_weight;
                do
                {
                    std::cout << '\t'
                              << '\t'
                              << "вес >= 0"                              
                              << ": ";
                    std::cin >> arc_weight;
                }while(arc_weight < 0 || WEIGHT_MAX <= arc_weight);
                arcs_weights[arc_cur] = arc_weight;
            }
        }        
    }while(static_cast<int>(arcs_set.size()) < n);
 
    T_vertices  vertices = get_vertices(arcs_set);
 
    T_adjacency_matr  adjacency_matr = get_adjacency_matr(vertices, arcs_weights, WEIGHT_MAX);
 
    std::cout << std::endl
              << "Матрица смежности графа ("
              << INFINITY_NAME 
              << " означает бесконечность):"
              << std::endl;
 
    print_matr(adjacency_matr, WEIGHT_MAX, INFINITY_NAME);
 
    std::cout << "Вершины графа:"
              << std::endl
              << '\t';
 
    std::copy(vertices.begin(), vertices.end(), 
              std::ostream_iterator<T_vertice>(std::cout, "\t"));
    std::cout << std::endl;
 
    const int  max_path_weight = 100;
    
    print_vertice_distant_not_further_than
        (
            max_path_weight,
            vertices,
            adjacency_matr,
            WEIGHT_MAX
        );
}
1
584 / 371 / 63
Регистрация: 22.07.2009
Сообщений: 875
Записей в блоге: 4
07.12.2010, 18:12 12
Цитата Сообщение от Mr.X Посмотреть сообщение
C++
1
...
Офигеть кодик....
Вот за что я люблю С#....
0
392 / 284 / 53
Регистрация: 26.12.2009
Сообщений: 874
07.12.2010, 18:19 13
Цитата Сообщение от sigmov Посмотреть сообщение
Офигеть кодик....
Mr.X в своем стиле
0
33 / 27 / 2
Регистрация: 08.09.2010
Сообщений: 402
07.12.2010, 20:22  [ТС] 14
Я в шоке....

Добавлено через 7 минут
Mr.X а можно хоть к началу кода пояснение, что там что означает?
0
33 / 27 / 2
Регистрация: 08.09.2010
Сообщений: 402
09.12.2010, 19:10  [ТС] 15
так, что?
0
33 / 27 / 2
Регистрация: 08.09.2010
Сообщений: 402
13.12.2010, 15:55  [ТС] 16
Mr.X, а проще код никак нельзя сделать?
0
Эксперт С++
3224 / 1751 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
13.12.2010, 17:10 17
Цитата Сообщение от White Luna Посмотреть сообщение
Mr.X, а проще код никак нельзя сделать?
В каком смысле проще?
0
79 / 78 / 6
Регистрация: 04.11.2010
Сообщений: 249
13.12.2010, 17:15 18
Цитата Сообщение от Mr.X Посмотреть сообщение
В каком смысле проще?
видимо, хуже
0
33 / 27 / 2
Регистрация: 08.09.2010
Сообщений: 402
13.12.2010, 17:28  [ТС] 19
Цитата Сообщение от Mr.X Посмотреть сообщение
В каком смысле проще?
в том что, код получается оч большим, и я половину переменных понять не могу
0
Эксперт С++
3224 / 1751 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
13.12.2010, 19:10 20
Цитата Сообщение от White Luna Посмотреть сообщение
в том что, код получается оч большим, и я половину переменных понять не могу
Ну я сделал программу с максимально удобным интерфейсом, где граф вводится в естественном виде. Если вводить сразу готовую матрицу смежности, то программу можно сделать гораздо короче.
А имена в программе вроде бы все самодокументируемые. Слепых однобуквенных идентификаторов я не применял.
1
13.12.2010, 19:10
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.12.2010, 19:10
Помогаю со студенческими работами здесь

Графы
Всем привет! Пишу в принципе год, но с графами не сталкивался, поэтому нужна помощь. Вообщем...

графы
помогите пожалуйста написать программу! Составить программу печати всех циклов ориентированного...

Графы на С++
Помогите плиз! Есть задача: Посвящение в студенты.Есть n студентов.НЕ ВСЕ знают друг друга.Но у...

Графы (с++)
Помогите с задачей: граф задается своей матрицей смежностей; вывести на экран матрицу инцидентности...


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

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