Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/75: Рейтинг темы: голосов - 75, средняя оценка - 4.53
0 / 0 / 2
Регистрация: 18.05.2015
Сообщений: 82

Раскрасить вершины графа, чтобы смежные вершины были окрашены в различные цвета

06.05.2018, 07:14. Показов 14207. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Прошу вашей помощи от безысходности. 4 дня назад выдана задача, которую требуется решить за неделю, по остаточному сроку, преподаватель просто напросто забыл выдать раньше. Времени, вкупе с остальной нагрузкой, на адекватное усвоение материала не хватает. От решения данной задачи зависит стипендия...

Для заданных k, n (k < n < 10) вершинам графа с n вершинами сопоставить натуральные числа 1,2...k (краски) таким образом, чтобы смежным вершинам были сопоставлены разные числа.

Рассматриваю алгоритм раскраски Ершова и простой перебор с возвратами. Буду рад любой посильной помощи.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.05.2018, 07:14
Ответы с готовыми решениями:

Реализация графа через смежные вершины
Здравствуйте. У меня есть задача- написать функции для графа через сопредельные вершины - добавить вершину, добавить ребро, добавить вес...

Найти все вершины графа, к которым существует путь заданной длины от выделенной вершины графа
Написать программу на prologuse на русском языке как на примере(Определить, является ли связным заданный граф.)

Вершины графа, к которым существует путь заданной длины от выделенной вершины графа
Есть стандартная задача: 1. Найти все вершины графа, к которым существует путь заданной длины от выделенной вершины графа Решение к...

1
 Аватар для ПерС
587 / 490 / 371
Регистрация: 05.11.2013
Сообщений: 1,271
Записей в блоге: 6
06.05.2018, 07:38
Лучший ответ Сообщение было отмечено ronital как решение

Решение

вот обход в глубину, например
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
//Visual Studio 2015
//Последовательная раскраска вершин графа при помощи
//обхода графа в глубину.        
//Граф представлен структурой Вирта.
#include <iostream>
#include <windows.h>
 
using namespace std;
 
#define TRUE 1
#define FALSE 0
typedef int Boolean;
typedef struct L *Lref; // Тип: указатель на заголовочный узел.
typedef struct T *Tref; // Тип: указатель на дуговой узел.
 
                        //Описание типа заголовочного узла.
typedef struct L
{
 int Key; //Имя заголовочного узла.
 int Color; //Цвет раскраски.
 int Count; //Количество предшественников.
 Boolean Flag; //Флаг посещения узла при обходе.
 Tref Trail; //Указатель на список смежности.
 Lref Next; //Указатель на следующий узел в списке заголовочных узлов.
};
 
//Описание типа дугового узла.
typedef struct T
{
 Lref Id;
 Tref Next;
};
 
class Spisok
{
private:
 Lref Head; //Указатель на голову списка заголовочных узлов.
 Lref Tail; //Указатель на фиктивный элемент 
            // в конце списка заголовочных узлов.
 int MSet[256]; //Вспомогательное множество, содер- 
                //жащее 0,1,2...,n.
 void SearchGraph(int, Lref *);
public:
 Spisok() {//Инициализация списка заголовочных узлов.
  Head = Tail = new (L);
 }
 Lref GetHead() { return Head; }
 Lref GetTail() { return Tail; }
 void MakeGraph();
 void PrintGraph();
 void Color(Lref, int);
 void Postr(int);
};
 
void Spisok::Postr(int n)
//Построение вспомогательного множества MSet.
{
 for (int i = 0; i<256; i++)
  MSet[i] = (i <= n) ? 1 : 0;
}
 
void Spisok::SearchGraph(int w, Lref *h)
//Функция возвращает указатель на заголовочный узел 
//с ключом w в графе, заданном структурой Вирта с указателем Head. 
{
 *h = Head; (*Tail).Key = w;
 while ((**h).Key != w) *h = (**h).Next;
 if (*h == Tail)
  //В списке заголовочных узлов нет узла с ключом w.
  //Поместим его в конец списка Head.
 {
  Tail = new (L); (**h).Count = 0;
  (**h).Trail = NULL; (**h).Next = Tail;
 }
}
 
void Spisok::MakeGraph()
//Функция возвращает указатель Head на структуру 
//Вирта, соответствующую ориентированному графу.
{
 int x, y;
 Lref p, q; //Рабочие указатели.
 Tref t, r; //Рабочие указатели.
 Boolean Res; //Флаг наличия дуги.
 cout << "Вводите начальную вершину дуги: ";
 cin >> x;
 while (x != 0)
 {
  cout << "Вводите конечную вершину дуги: "; cin >> y;
  //Определим, существует ли в графе дуга (x,y)?
  SearchGraph(x, &p); SearchGraph(y, &q);
  r = (*p).Trail; Res = FALSE;
  while ((r != NULL) && (!Res))
   if ((*r).Id == q) Res = TRUE;
   else r = (*r).Next;
   if (!Res) //Если дуга отсутствует, то поместим её в граф.
   {
    t = new (T); (*t).Id = q;
    (*t).Next = (*p).Trail; (*p).Trail = t; (*q).Count++;
   }
   cout << "Вводите начальную вершину дуги (0 - выход): "; cin >> x;
 }
}
 
void Spisok::PrintGraph()
//Вывод структуры Вирта, заданной указателем 
//Head и соответствующей ориентированному графу.
{
 Lref p; //Рабочий указатель.
 Tref q; //Рабочий указатель.
 
 p = Head;
 while (p != Tail)
 {
  cout << (*p).Key << "("; q = (*p).Trail;
  while (q != NULL)
  {
   cout << (*(*q).Id).Key; q = (*q).Next;
  }
  cout << ")"; p = (*p).Next; cout << " ";
 }
}
 
void Spisok::Color(Lref r, int n)
//Последовательная раскраска графа при помощи
//рекурсивного обхода графа в глубину.
//r - указатель на структуру Вирта.
//MSet - глобальное множество.
//n    - количество вершин в графе.
{
 Tref t, t1;
 int i;         //Параметр цикла.
 Boolean Fl;
 
 t = r->Trail; r->Flag = FALSE;
 //Сейчас мы находимся в вершине r->Key.
 //Исключим цвета всех вершин, смежных вершине
 //r->Key, из множества MSet.
 t1 = t;
 while (t1 != NULL)
 {
  MSet[t1->Id->Color] = 0; t1 = t1->Next;
 }
 //Выбор цвета вершины: это "первый" элемент множества MSet.
 Fl = TRUE; i = 1;
 while (Fl)
  if (MSet[i]) Fl = FALSE; else  i++;
 r->Color = i;   //Цвет присвоен!
 cout << "(" << r->Key << "," << r->Color << ") ";
 //Восстановление вспомогательного множества MSet.
 for (i = 0; i<256; MSet[i++] = 0);
 for (i = 0; i <= n; MSet[i++] = 1);
 // ------------- 
 while (t != NULL)
 {
  if (t->Id->Flag) Color(t->Id, n);
  t = t->Next;
 }
}
 
int main() {
 
 SetConsoleCP(1251);
 SetConsoleOutputCP(1251);
 //Если нет русских букв при вводе, поставьте шрифт Lucida Console в свойствах окна консоли
 
 Spisok A;
 Lref t; //Рабочий указатель для перемещения 
         // по списку заголовочных звеньев.
 int n = 0; //Количество вершин в графе.
 
            //Построение графа и вывод его структуры Вирта.
 A.MakeGraph();
 A.PrintGraph(); cout << endl;
 //Раскраска с помощью рекурсивного обхода графа в глубину.
 //Инициализация.
 t = A.GetHead(); //Установлен рабочий указатель.
 while (t != A.GetTail())
 {
  t->Flag = TRUE; t->Color = 0;
  n++; t = (*t).Next;
 }
 // ------------------------------------ 
 //Построение вспомогательного множества MSet.
 A.Postr(n);
 cout << "Результат раскраски: ";
 A.Color(A.GetHead(), n);
 
 system("pause");
 return 0;
}
Добавлено через 2 минуты
обход в ширину
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
//Visual Studio 2015
// Последовательная раскраска графа при помощи
//обхода графа в ширину. 
//Граф представлен структурой Вирта.
#include <iostream>
#include <windows.h>
using namespace std;
 
#define TRUE 1
#define FALSE 0
typedef int Boolean;
typedef struct Leader *Lref; // Тип: указатель на заголовочный узел.
typedef struct Trailer *Tref; // Тип: указатель на дуговой узел.
 
                              //Описание типа заголовочного узла.
typedef struct Leader
{
 int Key; //Имя заголовочного узла.
 int Count; //Количество предшественников.
 int Color; //Цвет раскраски.
 Boolean Flag; //Флаг посещения узла при обходе.
 Tref Trail; //Указатель на список смежности.
 Lref Next; //Указатель на следующий узел в списке заголовочных узлов.
};
 
//Описание типа дугового узла.
typedef struct Trailer
{
 Lref Id;
 Tref Next;
};
 
//Описание типа узла очереди.
typedef Lref TipElement; //Указатель на звено заголовочного списка.
typedef struct Zveno *svqz;
typedef struct Zveno
{
 TipElement Element; //Указатель на список смежности.
 svqz Sled;
};
 
class Spisok
{
private:
 Lref Head; //Указатель на голову списка заголовочных узлов.
 Lref Tail; //Указатель на фиктивный элемент
            // в конце списка заголовочных узлов.
 int MSet[256]; //Вспомогательное множество, содер- 
                //жащее 0,1,2...,n.
 void Udalenie_A(svqz *, svqz *, TipElement *);
 void Dobavlenie(svqz *, svqz *, TipElement);
 void SearchGraph(int, Lref *);
public:
 Spisok() {//Инициализация списка заголовочных узлов.
  Head = Tail = new (Leader);
 }
 Lref GetHead() { return Head; }
 Lref GetTail() { return Tail; }
 void MakeGraph();
 void PrintGraph();
 void Color(Lref, int);
 void Postr(int);
};
 
void Spisok::Postr(int n)
//Построение вспомогательного множества MSet.
{
 for (int i = 0; i<256; i++)
  MSet[i] = (i <= n) ? 1 : 0;
}
 
void Spisok::SearchGraph(int w, Lref *h)
//Функция возвращает указатель на заголовочный узел
//с ключом w в графе, заданном структурой Вирта с указателем Head.
{
 *h = Head; (*Tail).Key = w;
 while ((**h).Key != w) *h = (**h).Next;
 if (*h == Tail)
  //В списке заголовочных узлов нет узла с ключом w.
  //Поместим его в конец списка Head.
 {
  Tail = new (Leader); (**h).Count = 0;
  (**h).Trail = NULL; (**h).Next = Tail;
 }
}
 
void Spisok::MakeGraph()
//Функция возвращает указатель Head на структуру
//Вирта, соответствующую ориентированному графу.
{
 int x, y;
 Lref p, q; //Рабочие указатели.
 Tref t, r; //Рабочие указатели.
 Boolean Res; //Флаг наличия дуги.
 cout << "Вводите начальную вершину дуги: ";
 cin >> x;
 while (x != 0)
 {
  cout << "Вводите конечную вершину дуги: "; cin >> y;
  //Определим, существует ли в графе дуга (x,y)?
  SearchGraph(x, &p); SearchGraph(y, &q);
  r = (*p).Trail; Res = FALSE;
  while ((r != NULL) && (!Res))
   if ((*r).Id == q) Res = TRUE;
   else r = (*r).Next;
   if (!Res) //Если дуга отсутствует, то поместим её в граф.
   {
    t = new (Trailer); (*t).Id = q;
    (*t).Next = (*p).Trail; (*p).Trail = t; (*q).Count++;
   }
   cout << "Вводите начальную вершину дуги: "; cin >> x;
 }
}
 
void Spisok::PrintGraph()
//Вывод структуры Вирта, заданной указателем
//Head и соответствующей ориентированному графу.
{
 Lref p; //Рабочий указатель.
 Tref q; //Рабочий указатель.
 
 p = Head;
 while (p != Tail)
 {
  cout << (*p).Key << "("; q = (*p).Trail;
  while (q != NULL)
  {
   cout << (*(*q).Id).Key; q = (*q).Next;
  }
  cout << ")"; p = (*p).Next; cout << " ";
 }
}
 
void Spisok::Dobavlenie(svqz *L, svqz *R, TipElement elem)
//Добавление элемента elem в очередь, заданную указателями L и R.
{
 svqz K = new (Zveno);
 
 K->Element = elem; K->Sled = NULL;
 if (*L == NULL)
 {
  (*L) = K; (*R) = K;
 }
 else { (*R)->Sled = K; (*R) = K; }
}
 
void Spisok::Udalenie_A(svqz *L, svqz *R, TipElement *A)
//Удаление элемента из очереди, заданной указателями L и R и
//помещение удаленного элемента в переменную A.
{
 svqz q;
 
 if ((*L) != NULL)
  if ((*L)->Sled != NULL)
  {
   (*A) = (*L)->Element; q = (*L);
   (*L) = (*L)->Sled; delete q;
  }
  else {
   (*A) = (*L)->Element; delete *L;
   (*L) = (*R) = NULL;
  }
}
 
void Spisok::Color(Lref H, int n)
//Последовательная раскраска графа при помощи обхода графа
//в ширину, начиная с вершины, заданной указателем H
//(нерекурсивный обход).
{
 svqz L;   // Указатель на начало очереди.
 svqz R;   // Указатель на конец  очереди.
 Lref p;   // Рабочий указатель.
 Tref t;   // Рабочий указатель.
 Tref t1;
 int i;    // Параметр цикла.
 Boolean Fl;
 
 L = R = NULL; // Создание пустой очереди.
 Dobavlenie(&L, &R, H); H->Flag = FALSE;
 while (L != NULL)
 {  //Пока очередь не пуста...
  Udalenie_A(&L, &R, &p);
  t = p->Trail;
  //Сейчас мы находимся в вершине r->Key.
  //Исключим цвета всех вершин, смежных вершине 
  //r->Key, из множества MSet.
  t1 = t;
  while (t1 != NULL)
  {
   MSet[t1->Id->Color] = 0; t1 = t1->Next;
  }
  //Выбор цвета вершины - "первого" элемента множества MSet.
  Fl = TRUE; i = 1;
  while (Fl)
   if (MSet[i]) Fl = FALSE; else  i++;
  p->Color = i;   //Цвет присвоен!
  cout << "(" << p->Key << "," << p->Color << ") ";
  //Восстановление вспомогательного множества MSet.
  for (i = 0; i<256; MSet[i++] = 0);
  for (i = 0; i <= n; MSet[i++] = 1);
  while (t != NULL)
  {
   if (t->Id->Flag)
   {
    Dobavlenie(&L, &R, t->Id);
    t->Id->Flag = FALSE;
   }
   t = t->Next;
  }
 }
}
 
int main()
{
 
 SetConsoleCP(1251);
 SetConsoleOutputCP(1251);
 //Если нет русских букв при вводе, поставьте шрифт Lucida Console в свойствах окна консоли
 
 
 Spisok A;
 Lref t; //Рабочий указатель для перемещения 
         // по списку заголовочных звеньев.
 int n = 0; //Количество вершин в графе.
 
            //Построение графа и вывод его структуры Вирта.
 A.MakeGraph();
 A.PrintGraph(); cout << endl;
 //Раскраска с помощью рекурсивного обхода графа в ширину.
 //Инициализация.
 t = A.GetHead(); //Установлен рабочий указатель.
 while (t != A.GetTail())
 {
  t->Flag = TRUE; t->Color = 0;
  n++; t = (*t).Next;
 }
 // ------------------------------------ 
 //Построение вспомогательного множества MSet.
 A.Postr(n);
 cout << "Результат раскраски: ";
 A.Color(A.GetHead(), n);
 system("pause");
 return 0;
}
Добавлено через 4 минуты
и еще раскрасочка, если граф представлен списками смежности
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
//Visual Studio 2015
//Последовательная раскраска графа, представленного с помощью
//модифицированных списков смежности.
#include <iostream>
#include <windows.h>
using namespace std;
 
 
#define TRUE 1
#define FALSE 0
#define XRY 8  //Количество вершин графа.
typedef int Boolean;
typedef struct zveno *svqz;
typedef struct zveno
{
 int Key;  // Вершина графа.
 svqz Up;  // Указатель на смежную вершину.
 svqz Sled;// Указатель на следующую смежную вершину.
};
 
class Spisok
{
private:
 svqz Beg[XRY + 1]; //Массив указателей на вершины.
 void Add_Ver(int);
 int Find(int, int, svqz *);
 void Add_duga(int, int);
 void Make(int, int);
 void Delinenok(int, int);
 void Del_Duga(int, int);
 void Del_Ver(int);
 int Find_Color(int, int, svqz *);
public:
 Spisok();
 void Init_Graph();
 void Make_Graph();
 void Print_Graph();
 void Color();
 void Print_Color();
};
 
Spisok::Spisok()
{
 for (int i = 0; i <= XRY; Beg[i++] = NULL);
}
 
void Spisok::Add_Ver(int x)
//Функция создания вершины x.
{
 svqz Ukaz = new (zveno);
 
 Ukaz->Sled = NULL;
 Beg[x] = Ukaz;
}
 
void Spisok::Init_Graph()
//Функция инициализации модифицированных списков смежности.
{
 for (int i = 1; i <= XRY; i++) Add_Ver(i);
}
 
int Spisok::Find(int x, int y, svqz *UkZv)
//Функция проверки смежности вершин y и x. Функция возвращает
//TRUE, если  вершина x смежна с вершиной y. Указатель *UkZv,
//возвращает указатель на место y в списке  смежности x. Если
//вершина x не смежна с вершиной y, то UkZv есть NULL.
{
 svqz Ukaz;
 
 Ukaz = Beg[x]->Sled;
 while (Ukaz != NULL && Ukaz->Key != y)
  Ukaz = Ukaz->Sled;
 *UkZv = Ukaz;
 return  (Ukaz != NULL);
}
 
void Spisok::Add_duga(int x, int y)
//Функция создания дуги (x,y).
{
 svqz Ukaz = new (zveno);
 
 Ukaz->Sled = Beg[x]->Sled; Ukaz->Key = y;
 Beg[x]->Sled = Ukaz;
}
 
void Spisok::Make(int x, int y)
//Функция создания ребра {x,y}.
{
 svqz Ukaz;
 
 if (!Find(x, y, &Ukaz))
 {
  Add_duga(x, y);
  if (x != y) Add_duga(y, x);
  Beg[x]->Sled->Up = Beg[y];
  Beg[y]->Sled->Up = Beg[x];
 }
}
 
void Spisok::Make_Graph()
//Функция построения модифицированных списков смежности.
{
 int f;
 
 for (int i = 1; i <= XRY; i++)
 {
  cout << "Введите вершины, смежные с " << i << "-й вершиной: ";
  cin >> f;
  while (f != 0)
  {
   Make(i, f);
   cout << " ";
   cin >> f;
  }
  cout << endl;
 }
}
 
void Spisok::Delinenok(int x, int y)
//Функция удаления дуги (x,y).
{
 svqz Ukaz;
 svqz Ukazlenok;
 
 Ukazlenok = Beg[x]; Ukaz = Beg[x]->Sled;
 while (Ukaz != NULL && Ukaz->Key != y)
 {
  Ukazlenok = Ukaz; Ukaz = Ukaz->Sled;
 }
 if (Ukaz != NULL)
 {
  Ukazlenok->Sled = Ukaz->Sled;
  delete Ukaz;
 }
}
 
void Spisok::Del_Duga(int x, int y)
//Функция удаления ребра {x,y}.
{
 Delinenok(x, y); Delinenok(y, x);
}
 
void Spisok::Del_Ver(int x)
//Функция удаления вершины x.
{
 svqz Ukaz;
 svqz Ukazlenok;
 
 for (int i = 1; i <= XRY; i++) Delinenok(i, x);
 Ukaz = Beg[x]; Beg[x] = NULL;
 while (Ukaz != NULL)
 {
  Ukazlenok = Ukaz->Sled;
  delete Ukaz; Ukaz = Ukazlenok;
 }
}
 
void Spisok::Print_Graph()
//Функция вывода содеpжимого модифицированных
//списков смежности.
{
 svqz UkZv;
 
 for (int i = 1; i <= XRY; i++)
 {
  if (Beg[i] != NULL)
  {
   UkZv = Beg[i]->Sled;
   cout << i << " - ";
   while (UkZv != NULL)
   {
    cout << " " << UkZv->Key;
    UkZv = UkZv->Sled;
   }
  }
  cout << endl;
 }
}
 
int Spisok::Find_Color(int x, int c, svqz *UkZv)
//Функция  выявления возможности раскраски вершины  x цветом c. 
//Функция  возвращает TRUE, если вершину  x  можно  раскрасить. 
//Указатель *UkZv, возвращает указатель на вершину, смежную с x 
//и раскрашенную цветом c. Если вершину x можно раскрасить, то 
//*UkZv есть NULL.
{
 int i = 1;
 
 while (!(Find(x, i, &(*UkZv)) &&
  Beg[i]->Key == c) &&
  i != x) i++;
 return (i == x);
}
 
void Spisok::Color()
//Функция последовательной раскраски графа, заданного
//модифицированными списками смежности Beg.
{
 int i = 1;
 int c = 1;
 svqz UkZv;
 
 while (Beg[i] == NULL && i <= XRY) i++;
 if (i != XRY)
 {
  Beg[i]->Key = c;
  i++;
  while (i <= XRY)
   if (Beg[i] != NULL)
   {
    c = 1;
    while (!Find_Color(i, c, &UkZv)) c++;
    Beg[i]->Key = c; i++;
   }
   else  i++;
 }
 else  cout << "Граф отсутствует!";
}
 
void Spisok::Print_Color()
//Функция вывода раскраски графа, заданного
//модифицированными списками смежности Beg.
{
 for (int i = 1; i <= XRY; i++)
  if (Beg[i] != NULL)
   cout << " Color " << i << " - " << Beg[i]->Key << endl;
}
 
 
int main()
{
 
 SetConsoleCP(1251);
 SetConsoleOutputCP(1251);
 //Если нет русских букв при вводе, поставьте шрифт Lucida Console в свойствах окна консоли
 
 Spisok A;
 
 //Инициализация графа.
 A.Init_Graph();
 //Построение графа.
 A.Make_Graph();
 //Вывод графа.
 A.Print_Graph();
 
 
 //Последовательная раскраска графа, представленного
 //модифицированными списками смежности.
 A.Color();
 A.Print_Color();
 system("pause");
 return 0;
}
в чем запускалось - в 1-й строке
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.05.2018, 07:38
Помогаю со студенческими работами здесь

Найти кратчайшее расстояние из вершины v1 неориентированного взвешенного графа в другие вершины графа
Пользуясь алгоритмом Дейкстры, найти кратчайшее расстояние из вершины v1 неориентированного взвешенного графа в другие вершины графа....

Найти все вершины заданного графа, недостижимые от заданной его вершины
Помогите написать программу. Условие: Найти все вершины заданного графа, недостижимые от заданной его вершины.

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

Найти вершины графа, находящихся на заданном расстоянии от данной вершины
Есть неориентированный граф задан матрицей смежности, нужно найти вершины графа находящихся на заданном расстоянии от данной вершины. Буду...

Найти вершины графа, находящихся на заданном расстоянии от данной вершины
Найти вершины графа, находящихся на заданном расстоянии от данной вершины. Абсолютно безвыходная ситуация, для выхода из которой нужна...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru