Advertisement
Guest User

Untitled

a guest
Mar 11th, 2020
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.91 KB | None | 0 0
  1. #include <iostream>
  2. #include <conio.h>
  3. using namespace std;
  4. #define TRUE 1
  5. #define FALSE 0
  6. #define XRY 8 //Количество вершин графа.
  7. typedef int Boolean;
  8. typedef struct zveno *svqz;
  9. typedef struct zveno
  10. {
  11. int Key; // Вершина графа.
  12. svqz Up; // Указатель на смежную вершину.
  13. svqz Sled;// Указатель на следующую смежную вершину.
  14. };
  15.  
  16. class Spisok
  17. {
  18. private:
  19. svqz Beg[XRY+1]; //Массив указателей на вершины.
  20. void Add_Ver (int);
  21. int Find (int, int, svqz *);
  22. void Add_duga (int, int);
  23. void Make (int, int);
  24. void Delinenok (int, int);
  25. void Del_Duga (int, int);
  26. void Del_Ver (int);
  27. int Find_Color (int, int, svqz *);
  28. public:
  29. Spisok();
  30. void Init_Graph ();
  31. void Make_Graph ();
  32. void Print_Graph ();
  33. void Color ();
  34. void Print_Color ();
  35. };
  36.  
  37. int main ()
  38. {
  39. Spisok A;
  40.  
  41. //Инициализация графа.
  42. A.Init_Graph ();
  43. //Построение графа.
  44. A.Make_Graph ();
  45. //Вывод графа.
  46. A.Print_Graph ();
  47. getch();
  48. //Последовательная раскраска графа, представленного
  49. //модифицированными списками смежности.
  50. A.Color ();
  51. A.Print_Color ();
  52. getch();
  53. }
  54.  
  55. Spisok::Spisok()
  56. {
  57. for ( int i=0; i<=XRY;Beg[i++] = NULL );
  58. }
  59.  
  60. void Spisok::Add_Ver (int x)
  61. //Функция создания вершины x.
  62. {
  63. svqz Ukaz = new (zveno);
  64.  
  65. Ukaz->Sled = NULL;
  66. Beg[x] = Ukaz;
  67. }
  68.  
  69. void Spisok::Init_Graph ()
  70. //Функция инициализации модифицированных списков смежности.
  71. {
  72. for (int i=1;i<=XRY;i++) Add_Ver (i);
  73. }
  74.  
  75. int Spisok::Find (int x, int y, svqz *UkZv)
  76. //Функция проверки смежности вершин y и x. Функция возвращает
  77. //TRUE, если вершина x смежна с вершиной y. Указатель *UkZv,
  78. //возвращает указатель на место y в списке смежности x. Если
  79. //вершина x не смежна с вершиной y, то UkZv есть NULL.
  80. {
  81. svqz Ukaz;
  82.  
  83. Ukaz = Beg[x]->Sled;
  84. while (Ukaz != NULL && Ukaz->Key != y)
  85. Ukaz = Ukaz->Sled;
  86. *UkZv = Ukaz;
  87. return ( Ukaz != NULL );
  88. }
  89.  
  90. void Spisok::Add_duga (int x, int y)
  91. //Функция создания дуги (x,y).
  92. {
  93. svqz Ukaz = new (zveno);
  94.  
  95. Ukaz->Sled = Beg[x]->Sled; Ukaz->Key = y;
  96. Beg[x]->Sled = Ukaz;
  97. }
  98.  
  99. void Spisok::Make (int x, int y)
  100. //Функция создания ребра {x,y}.
  101. {
  102. svqz Ukaz;
  103.  
  104. if ( !Find(x,y,&Ukaz) )
  105. {
  106. Add_duga (x,y);
  107. if ( x != y ) Add_duga (y,x);
  108. Beg[x]->Sled->Up = Beg[y];
  109. Beg[y]->Sled->Up = Beg[x];
  110. }
  111. }
  112.  
  113. void Spisok::Make_Graph ()
  114. //Функция построения модифицированных списков смежности.
  115. {
  116. int f;
  117.  
  118. for (int i=1;i<=XRY;i++)
  119. {
  120. cout << "ENTER SUMIZNA VERTEX WITH " << i ;
  121. cin >> f;
  122. while (f!=0)
  123. {
  124. Make (i,f);
  125. cout << " ";
  126. cin >> f;
  127. }
  128. cout << endl;
  129. }
  130. }
  131.  
  132. void Spisok::Delinenok (int x, int y)
  133. //Функция удаления дуги (x,y).
  134. {
  135. svqz Ukaz;
  136. svqz Ukazlenok;
  137.  
  138. Ukazlenok = Beg[x]; Ukaz = Beg[x]->Sled;
  139. while (Ukaz != NULL && Ukaz->Key != y)
  140. { Ukazlenok = Ukaz; Ukaz = Ukaz->Sled; }
  141. if ( Ukaz != NULL )
  142. {
  143. Ukazlenok->Sled = Ukaz->Sled;
  144. delete Ukaz;
  145. }
  146. }
  147.  
  148. void Spisok::Del_Duga (int x, int y)
  149. //Функция удаления ребра {x,y}.
  150. {
  151. Delinenok (x,y); Delinenok (y,x);
  152. }
  153.  
  154. void Spisok::Del_Ver (int x)
  155. //Функция удаления вершины x.
  156. {
  157. svqz Ukaz;
  158. svqz Ukazlenok;
  159.  
  160. for (int i=1;i<=XRY;i++) Delinenok (i,x);
  161. Ukaz = Beg[x]; Beg[x] = NULL;
  162. while ( Ukaz != NULL )
  163. {
  164. Ukazlenok = Ukaz->Sled;
  165. delete Ukaz; Ukaz = Ukazlenok;
  166. }
  167. }
  168.  
  169. void Spisok::Print_Graph ()
  170. //Функция вывода содеpжимого модифицированных
  171. //списков смежности.
  172. {
  173. svqz UkZv;
  174.  
  175. for (int i=1;i<=XRY;i++)
  176. {
  177. if ( Beg[i] != NULL )
  178. {
  179. UkZv = Beg[i]->Sled;
  180. cout << i << " - ";
  181. while ( UkZv != NULL )
  182. {
  183. cout << " " << UkZv->Key;
  184. UkZv = UkZv->Sled;
  185. }
  186. }
  187. cout << endl;
  188. }
  189. }
  190.  
  191. int Spisok::Find_Color (int x, int c, svqz *UkZv)
  192. //Функция выявления возможности раскраски вершины x цветом c.
  193. //Функция возвращает TRUE, если вершину x можно раскрасить.
  194. //Указатель *UkZv, возвращает указатель на вершину, смежную с x
  195. //и раскрашенную цветом c. Если вершину x можно раскрасить, то
  196. //*UkZv есть NULL.
  197. {
  198. int i = 1;
  199.  
  200. while (!(Find(x,i,&(*UkZv)) &&
  201. Beg[i]->Key==c) &&
  202. i != x) i++;
  203. return (i==x);
  204. }
  205.  
  206. void Spisok::Color ()
  207. //Функция последовательной раскраски графа, заданного
  208. //модифицированными списками смежности Beg.
  209. {
  210. int i = 1;
  211. int c = 1;
  212. svqz UkZv;
  213.  
  214. while (Beg[i] == NULL && i<=XRY) i++;
  215. if ( i != XRY )
  216. {
  217. Beg[i]->Key = c;
  218. i++;
  219. while (i<=XRY)
  220. if ( Beg[i] != NULL )
  221. {
  222. c = 1;
  223. while (!Find_Color(i,c,&UkZv)) c++;
  224. Beg[i]->Key = c; i++;
  225. }
  226. else i++;
  227. }
  228. else cout << "Without graph!";
  229. }
  230.  
  231. void Spisok::Print_Color ()
  232. //Функция вывода раскраски графа, заданного
  233. //модифицированными списками смежности Beg.
  234. {
  235. for (int i=1;i<=XRY;i++)
  236. if ( Beg[i] != NULL )
  237. cout << " Color " << i << " - " << Beg[i]->Key << endl;
  238. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement