You are on page 1of 19

UNIVERSITATEA DE STAT DIN MOLDOVA

LUCRAREA

DE LABORATOR 2

La

Algoritmica Grafurilor

Student: Ho Ngoc Trung - IA21

Profesor: Țurcanu Călin


TEMA: COLORAREA GRAFULUI
Program pentru determina colorarea varfurilor si numarul
cromatic. Metoda Succesivă:
Aranjăm vârfurile grafului într-o ordine necrescătoare a gradelor şi
atribuim primului vârf din lista ordonată culoarea 1. Parcurgem lista
şi atribuim culoarea 1 fiecărui vârf neadiacent cu nici unul din
vârfurile deja colorate cu această culoare. Apoi revenim la primul vârf
necolorat. Atribuim acestui vârf culoarea 2 şi din nou parcurgem lista
ordonată a gradelor vârfurilor, colorând cu culoarea 2 fiecare vârf
încă necolorat şi neadiacent cu nici unul din vârfurile deja colorate cu
această culoare. Procedeul se repetă până vor fi colorate toate
vârfurile grafului. Numărul de culori utilizate la această colorare este
o aproximare a numărului cromatic al grafului

#include "iostream"
#include "stdlib.h"
using namespace std;
class varful // clasa de varfuri
{
public:
int nume,gradul,culoare,k;
varful() {nume=0;gradul=0;culoare=0;k=0;}

void add_grad()
{
gradul++;
}
void num(int x) // setare nume varful
{
nume =x;
}
void color(int x) // setare culoare pentru un varf
{
culoare =x;
}
void verific() // verfica daca varful este colorat
{
k=1;
}
};

void aranja(varful v[20],int n) // Aranja multime varfurilor in ordine


necrescatoare gradul
{ varful tg;
int i,j;

for (i = 1; i < n; i++)


for (j = i+1; j <= n; j++)
if(v[i].gradul<v[j].gradul)
{
tg=v[i];
v[i]=v[j];
v[j]=tg;
}
}
int main()
{
int i, j, n, a[20][20],color=1;
varful v[20];
cout<< " Introduceti numar varfurilor ";
cin>>n;
cout<< "Introduceti matrice adiacenta:\n ";
for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++)
{
printf("a[%d][%d]", i, j);
cin >> a[i][j];
v[i].num(i);
}
system("cls");
cout<< "Matrice adiacenta: "<<endl;
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
printf("%3d", a[i][j]);
printf("\n");
}
// Determina gradul pentru fiecare varf
for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++)
if(a[i][j]==1)
v[i].add_grad();
// Aranja multime varfurilor in ordine necrescatoare gradul
aranja(v,n);
// Determina culoare pentru varfuri
for (i = 1; i <= n; i++)
if(v[i].k==0)
{v[i].color(color);v[i].verific();
for (j = 1; j <= n; j++)
if(a[v[i].nume][v[j].nume]==0)
{
v[j].color(color); v[j].verific();
}
color++;
}
//Afisera rezultatul
for(i=1;i<color;i++)
{
printf("culoare %d: varfurile (",i);
for(j=1;j<=n;j++)
if(v[j].culoare==i)
printf("%2d",v[j].nume);
printf(" )");
printf("\n");
}
printf("Numarul cromatic este %d",color-1);
}
Exemplu:

Rezultatul:
a. Să se determine numărul cromatic pentru grafurile:

3 4

χ(G)=4

1 4

2 3

7 6

8 5

χ(G)=2
χ(G)=3

χ(G)=2
χ(G)=3

χ(G)=4
χ(G)=3

χ(G)=3
χ(G)=3
χ(G)=2

b Să se determine indexul cromatic pentru grafurile din


problema 1.

χ (G)=3
χ (G)=5

χ (G

)=3
χ (G)=4
χ (G)=6

χ (G)=6
χ (G)=3

χ (G)=3
χ (G)=4
c.Să se reprezinte grafurile indexul cromatic al cărora
este egal cu 2.

Graf Cn ( n = 2k ):
d. Să se dee exemplu de graf, pentru care colorarea după
muchii nu e minimală.

You might also like