Anda di halaman 1dari 5

File: /home/nancy/Desktop/Proyecto/coloreo.

Page 1 of 5

//*****************************************************************************
// Coloracion de grafos:
// Este programa crea coloraciones de un grafo mediante tres heuristicas
// *Metodo secuencial greedy
// *Algoritmo de coloracin Welsh-Powell
// *Algoritmo de coloracin Matula-Marble-Isaacson
// Como salida del programa, se crea un documento coloracion.txt con los
// conjuntos independientes, etiquetados con letras como colores.
//
// El programa permite ingresar el nombre del archivo donde se encuentra el
// grafo desde su ejecucion.
// Ejemplo: ./a.out nombre.txt
// El formato del documento de entrada es:
//
// G1 n=10 a=7(1,2)(3,4)(4,5)(6,3)(7,8)(9,5)(8,9)
//
// G1 representa el grafo sobre el cual trabaja, n es el numero de vertices y
// a el numero de aristas.
//*****************************************************************************
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
struct orden{
int grado; //representa el numero de
conexiones
int color; // representa el valor del
numero:)
int n;
//representa el numero de
vertice :)
};
typedef struct orden ver;
void Matriz(int n, int*** aqui,char* nom){
matriz de Adyacencias :P
FILE *f;
int i,j,x,y,w, aa,o,op;
int **ad = NULL;
ad = (int**)malloc(sizeof(int*)*n);
for(i=0;i<n;i++){
ad[i]=(int*)malloc(sizeof(int)*n);
}
for(i=0;i<n;i++){
for(j=0;j<n;j++){
ad[i][j]=0;
}
}
//Se habre el archivo y se llena la matriz
f=fopen(nom,"r");
fscanf(f,"G%d n=%d a=%d",&w,&n,&aa);
for(i=0;i<aa;i++){
fscanf(f,"(%d,%d)",&x,&y);
ad[x-1][y-1]=1;
ad[y-1][x-1]=1;
}
fclose(f);
*aqui = ad;
return;
}
void Greedy(int n,int aa, int** ad,char *nom){
FILE *f,*ff;
ver v[n];
int i,j,aux,zz,max=1;

//Es para guardar la

File: /home/nancy/Desktop/Proyecto/coloreo.c
for(i=0;i<n;i++){
v[i].color=0;
}
//Etapa de Coloracion
for(i=0;i<n;i++){
v[i].color=1;
zz=0;
aux=1;
while(aux==1){
for(j=0;j<n;j++){
if(ad[j][i]==1){
if(v[i].color==v[j].color){
zz=1;
}
}
}
if(zz==1){
aux=1;
zz=0;
v[i].color++;
}else{
aux=0;
}
if(v[i].color > max){
max=v[i].color;
}
}
}
//Se guarda en archivo la coloracion :)
ff=fopen("coloracion.txt","w+");
printf("\nAlgoritmo Voraz :)\nmaxcolor= %d\n",max);
fprintf(ff,"\nAlgoritmo Voraz :)\nmax= %d\n",max);
//Se imprime el conjunto de vertices de cada
color
for(i=0;i<max;i++){
printf(" %c= { ",'a'+i);
fprintf(ff," %c= { ",'a'+i);
for(j=0;j<n;j++){
if(v[j].color==i+1){
printf("%d ",j+1);
fprintf(ff,"%d ",j+1);
}
}
printf("}\n");
fprintf(ff,"}\n");
}
fclose(ff);
}
void WelshPowell(int n,int** ad,char *nom){
ver v[n];
FILE *ff;
int x,y,i,j,aux,zz,max=1;
//Se inicializa el grado y color en cero
for(i=0;i<n;i++){
v[i].grado=0;
v[i].color=0;
v[i].n=i+1;
}
//Se encuentra el grado de los vertices.
for(i=0;i<n;i++){
for(j=0;j<n;j++){
if(ad[i][j]==1){
v[i].grado++;
v[j].grado++;

Page 2 of 5

File: /home/nancy/Desktop/Proyecto/coloreo.c
}
}
}
for(i=0;i<n;i++){
v[i].grado=v[i].grado/2;
}
//Ordenacion en funcion de sus grados!
for(j=0;j<n;j++){
for(i=0+1+j;i<n;i++){
if(v[i].grado>v[j].grado){
aux=v[j].grado;
v[j].grado=v[i].grado;
v[i].grado=aux;
aux=v[j].n;
v[j].n=v[i].n;
v[i].n=aux;
}
}
}
//Etapa de
Coloracion
for(i=0;i<n;i++){
v[i].color=1;
zz==0;
aux=1;
while(aux==1){
for(j=0;j<n;j++){
if(ad[v[j].n-1][v[i].n-1] == 1){
if(v[i].color == v[j].color){
zz=1;
}
}
}//while
if(zz==1){
v[i].color++;
zz=0;
aux=1;
}else{
aux=0;
}
if(v[i].color>max){
max=v[i].color;
}
}//while 2
}//
for
//Se Imprime el Coloreo :) y se guarda en "coloracion.txt"
ff=fopen
("coloracion.txt","a");
printf("\nAlgoritmo de coloracin Welsh-Powell\nmaxcolor= %d\n",max);
fprintf(ff,"\nAlgoritmo de coloracion welsh-Powell\nmax= %d\n",max);
//Se imprime el conjunto de vertices de cada
color
for(i=0;i<max;i++){
printf(" %c= { ",'a'+i);
fprintf(ff," %c= { ",'a'+i);
for(j=0;j<n;j++){
if(v[j].color==i+1){
printf("%d ",v[j].n);
fprintf(ff,"%d ",v[j].n);
}
}
printf("}\n");
fprintf(ff,"}\n");
}
fclose(ff);

Page 3 of 5

File: /home/nancy/Desktop/Proyecto/coloreo.c
}
void MMI(int n,int** ad,char *nom){
ver v[n];
FILE *f,*ff;
int x,y,i,j,aux,zz,max=1;
//Se inicializa el grado y color en cero
for(i=0;i<n;i++){
v[i].grado=0;
v[i].color=0;
v[i].n=i+1;
}
//Se encuentra el grado de los
vertices.
for(i=0;i<n;i++){
for(j=0;j<n;j++){
if(ad[i][j]==1){
v[i].grado++;
v[j].grado++;
}
}
}
for(i=0;i<n;i++){
v[i].grado=v[i].grado/2;
}
//Ordenacion en funcion de sus grados!
for(j=0;j<n;j++){
for(i=0+1+j;i<n;i++){
if(v[i].grado<v[j].grado){
aux=v[j].grado;
v[j].grado=v[i].grado;
v[i].grado=aux;
aux=v[j].n;
v[j].n=v[i].n;
v[i].n=aux;
}
}
}
//Etapa de Coloracion
v[0].color=1;
for(i=1;i<n;i++){
v[i].color=1;
zz==0;
aux=1;
while(aux==1){
for(j=0;j<n;j++){
if(ad[v[i].n-1][v[j].n-1]){
if(v[i].color == v[j].color){
zz=1;
}
}
}//for
if(zz==1){
v[i].color++;
zz=0;
aux=1;
}else{
aux=0;
}
if(v[i].color>max){
max=v[i].color;
}
}//while 2
}//for
//Se Imprime el Coloreo :)

Page 4 of 5

File: /home/nancy/Desktop/Proyecto/coloreo.c

Page 5 of 5

ff=fopen("coloracion.txt","a");
printf("\nAlgoritmo de coloracin Matula-Marble-Isaacson\nmaxcolor= %d\n",max);
fprintf(ff,"\nAlgoritmo de coloracin Matula-Marble-Isaacson\nmax= %d\n",max);
//Se imprime el conjunto de vertices de cada color
for(i=0;i<max;i++){
printf(" %c= { ",'a'+i);
fprintf(ff," %c= { ",'a'+i);
for(j=0;j<n;j++){
if(v[j].color==i+1){
printf("%d ",v[j].n);
fprintf(ff,"%d ",v[j].n);
}
}
printf("}\n");
fprintf(ff,"}\n");
}
fclose(ff);
}

//
**************************************************************************************************************
int main(int argc,char* argv[]){
FILE *f;
int n=0,aa,b,p=30,w,a;
int** adj;
char *nom;
nom=(char*)malloc(sizeof(char)*p);
strcpy(nom,argv[1]);
f=fopen(nom,"r+");
fscanf(f,"G%d n=%d a=%d",&w,&n,&aa);
fclose(f);
printf("\nHay %d aristas en el grafo",aa);
printf("\nHay %d vertices\n",n);
Matriz(n,&adj,nom);
//Aqui se crea la matriz de adyacencias
Greedy(n,aa,adj,nom);
//Se colorea vertice a vertice en el orden inicial
WelshPowell(n,adj,nom);
//Se colorea vertice a vertice iniciando por los de mayor grado
MMI(n,adj,nom);
//Se colorea vertice a vertice iniciando por los de menor grado
return 0;
}

Anda mungkin juga menyukai