Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
1 / 1 / 0
Регистрация: 12.12.2013
Сообщений: 53
1

Раскраска графа в минимальное кол-во цветов

16.12.2013, 09:54. Показов 3583. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. Скажите,как можно реализовать раскраску графа в минимальное количество цветов. Раскраска должна производиться таким образом,что любые 2 смежные вершины не должны быть окрашены в 1 цвет. Для графа задана матрица и матрица инцидентности.
пишу в делфи.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.12.2013, 09:54
Ответы с готовыми решениями:

Раскраска графа
Для раскраски графа используем заданную матрицу инцидентности(лежит в массиве mes). type ...

Раскраска вершин графа
Как можно раскрасить вершины графа, используя минимальное количество красок, имея матрицу смежности...

Последовательная раскраска графа
всем доброго времени суток! нужна помощь, не могу разобраться что нужно накидать на форму,...

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

5
Модератор
3490 / 2613 / 741
Регистрация: 19.09.2012
Сообщений: 7,974
16.12.2013, 10:18 2
Цитата Сообщение от Macken111 Посмотреть сообщение
пишу в делфи.
Покажи, что пишешь.
0
1 / 1 / 0
Регистрация: 12.12.2013
Сообщений: 53
16.12.2013, 10:29  [ТС] 3
Цитата Сообщение от FIL Посмотреть сообщение
Покажи, что пишешь.
В общем,вот код. Использую 1 Image, 3 StringGrid и 2 Button. В общем,здесь рисуются вершины графа нажатием на Image,к нему добавляются ребра кнопкой Button 2. Сама прорисовка ребра на форме3. Также,сразу заполняются матрицы смежности и инцидентности.
Вот,собственно,код:
для формы1:
Pascal
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
var i,k,coun1,coun2,a,s: integer;
 
 
procedure TForm1.Button1Click(Sender: TObject);
begin
TabSheet3.Show;
end;
   //////////òûêíóëè íà ìûø
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
  begin
  TabSheet1.TabVisible:=true;
  TabSheet2.TabVisible:=true;
  Button2.Visible:=true;
  Button3.Visible:=true;
//ñîçäàíèå âåðøèíû
  with Image1.Canvas do
    begin
      Pen.Color:=clBlack;
      Brush.Color:=clBlack;
      Ellipse(X-5,Y-5,X+30,Y+30);
      Font.Color:=clWhite;
      Font.Size:=10;
      Font.Name:='Arial';
      TextOut(X+5,Y+2,IntToStr(i));
      i:=i+1;
    end;
    //îôîðìëåíèå òàáëèöû ñìåæíîñòè
    StringGrid1.ColCount:=i;
    StringGrid1.RowCount:=i;
    StringGrid1.Cells[0,1]:='X1';
    StringGrid1.Cells[0,i]:='X'+IntToStr(i);
    StringGrid1.Cells[1,0]:='X1';
    StringGrid1.Cells[i,0]:='X'+IntToStr(i);
    //Çàïèñü êîîðäèíàò â òàáëèöó êîîðäèíàò
    StringGrid2.RowCount:=i;
    StringGrid2.Cells[1,i-1]:=IntToStr(X);
    StringGrid2.Cells[2,i-1]:=IntToStr(Y);
    StringGrid2.Cells[0,1]:='X1';
    StringGrid2.Cells[0,i]:='X'+IntToStr(i);
    StringGrid2.Cells[1,0]:='X';
    StringGrid2.Cells[2,0]:='Y';
    //îôîðìëåíèå òàáëèöû èíöèäåíòíîñòè
    StringGrid3.RowCount:=i;
    StringGrid3.Cells[0,1]:='X1';
    StringGrid3.Cells[0,i]:='X'+IntToStr(i);
    //çàíóëåíèå ìàòðèöû ñìåæíîñòè
    for coun1:=1 to i do
    begin
        for coun2:=1 to i do
        begin
            if StringGrid1.Cells[coun1,coun2]='' then
              StringGrid1.Cells[coun1,coun2]:='0';
        end;
    end;
 
//èçìåíåíèå ðàçìåðîâ òàáëèöû
    StringGrid1.ColWidths[0]:=22;
    StringGrid1.ColWidths[i-1]:=22;
    StringGrid1.RowHeights[0]:=20;
    StringGrid1.RowHeights[i-1]:=20;
    a:=StringGrid1.ColCount;
 
 
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
i:=1;
k:=0;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
Form3.show;
//çàíóëåíèå ìàòðèöû èíöèäåíòíîñòè
s:=StringGrid3.ColCount;
for coun1:=1 to s do
begin
    for coun2:=1 to i do
    begin
        if StringGrid3.Cells[coun1,coun2]='' then
           StringGrid3.Cells[coun1,coun2]:='0';
    end;
end;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
Form3.show;
//зануление матрицы инцидентности
s:=StringGrid3.ColCount;
for coun1:=1 to s do
begin
    for coun2:=1 to i do
    begin
        if StringGrid3.Cells[coun1,coun2]='' then
           StringGrid3.Cells[coun1,coun2]:='0';
    end;
end;
end;
для формы3:

Pascal
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
var
p,t:integer;
st:string;
 
procedure TForm3.Button1Click(Sender: TObject);
var
i,j,x,y:integer;
begin
begin
    st:=Edit1.Text;
    t:=pos(' ',st);
    Delete(st,t,1);
    Edit1.Text:=st;
end;
//создание ребра
if (Edit1.Text<>'') and (Edit2.Text<>'') then
begin
i:=StrToInt(Edit1.Text);
j:=StrToInt(Edit2.Text);
x:=strtoint(Form1.StringGrid2.cells[1,i]);
y:=strtoint(Form1.StringGrid2.cells[2,i]);
with Form1.Image1.Canvas do
begin
  Pen.Color:=clBlack;
  MoveTo(x,y);
  x:=strtoint(Form1.StringGrid2.cells[1,j]);
  y:=strtoint(Form1.StringGrid2.cells[2,j]);
  LineTo(x,y);
end;
//оформление шапки таблицы инцидентности
Form1.StringGrid3.ColCount:=p+1;
Form1.StringGrid3.Cells[p,0]:='X'+IntToStr(i)+'vX'+IntToStr(j);
Form1.StringGrid3.FixedCols:=1;
//заполнение матрицы смежности
        with Form1.StringGrid1 do
        begin
            Cells[i,j]:='1';
            Cells[j,i]:='1';
        end;
 
//заполнение матрицы инцидентности
with Form1.StringGrid3 do
begin
Cells[p,i]:='1';
Cells[p,j]:='1';
end;
end;
 
close;
end;
 
procedure TForm3.FormShow(Sender: TObject);
begin
Edit1.Text:='';
Edit2.Text:='';
p:=Form1.StringGrid3.ColCount;
Edit1.SetFocus;
end;
 
procedure TForm3.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if Key = VK_RETURN then
begin
    st:=Edit1.Text;
    t:=pos(' ',st);
    Delete(st,t,1);
    Edit1.Text:=st;
    Button1.Click;
end;
if Key=vk_Space then
Edit2.SetFocus;
end;
 
end.
0
1 / 1 / 0
Регистрация: 12.12.2013
Сообщений: 53
16.12.2013, 10:31  [ТС] 4
Вот сам проект,если что.

Gravis.rar
0
Модератор
3490 / 2613 / 741
Регистрация: 19.09.2012
Сообщений: 7,974
16.12.2013, 11:44 5
На вскидку, для раскраски можно использовать матрицу инцидентности.
Берем первую вершину (строку) и удаляем из матрицы все смежные с ней вершины.
Далее, берем следующую вершину (строку) и удаляем все лишнее для нее.
И т.д.
То, что останется - вершины одного цвета.
Затем, берем матрицу, состоящую из "удаленных" вершин и проделываем все тоже самое - это будет второй цвет.
И так пока вершины не закончатся.
Миниатюры
Раскраска графа в минимальное кол-во цветов  
1
1 / 1 / 0
Регистрация: 12.12.2013
Сообщений: 53
16.12.2013, 21:27  [ТС] 6
Спасибо, попробую реализовать.
0
16.12.2013, 21:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.12.2013, 21:27
Помогаю со студенческими работами здесь

Раскраска планарного графа в 5 цветов
Собственно задача: раскрасить планарный граф в 5 цветов. Я поступаю следующим образом: используя...

Раскраска графа
Условие и рисунок такие же как и на данном сайте http://domzadanie.ru/ans.php?id=155&amp;show=all...

Раскраска графа
Здравствуйте! Известно, что последовательный алгоритм раскраски графа не всегда строит...

Раскраска графа
Граждане, подскажите, какой метод точной раскраски графа более оптимален для реализации на компе?...


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

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