Sie sind auf Seite 1von 6

22/9/2018 ALGORITMOS DE COLORACIÓN DE GRAFOS - Making Code

001 #include < cstdlib >


002 #include < iostream >
003 #include < conio.h >
004 #include < windows.h >
005 #include < stdio.h >
006 #include < stdlib.h >
007 #define vertices 500
008 #define nodos 300
009
010 using namespace std;
011
012 struct orden{
013 int grado; //representa el numero de conexiones
014 int color; // representa el valor del numero
015 int n; //representa el numero de vertice
016 };
017 typedef struct orden ver;
018
019 int B[nodos];//,ad[vertices][vertices];
020
021 //Ordenamos Mediante el Metodo de Ordenacion: Inserccion
022 void OrdenarMayaMen(int n, ver v[])
023 {
024 int i,k;
025 int aux,aux1;
026 for(i=1;i < n;i++)
027 {
028 aux=v[i].grado;
029 aux1=B[i];
030 k=i-1;
031 while(k > =0 && aux > v[k].grado)
032 {
033 v[k+1].grado=v[k].grado;
034 B[k+1]=B[k];
035 k=k-1;
036 }
037 v[k+1].grado=aux;
038 B[k+1]=aux1;
039 }
040 }
041
042 void IngresarMatriz(int ad[][vertices],int nds, int arst)//,int ad[]
[vertices]) //Es para guardar la matriz de Adyacencias :P
043 {
044 int i,j,nodoi,nodof;
045
046 for(i=0;i < nds;i++)
047 { for(j=0;j < nds;j++)
048 { ad[i][j]=0;}
049 }
050
051 //Llenamos la matriz
052 for(i=0;i < arst;i++)
053 { cout < < "\n\n\tArista " < < i+1 < < "\n";
054 cout < < "\tN. inicio: ";
055 cin > > nodoi;
http://blog.andresed.me/2015/08/algoritmos-de-coloracion-de-grafos.html 1/6
22/9/2018 ALGORITMOS DE COLORACIÓN DE GRAFOS - Making Code

056 cout < < "\tN. termino: ";


057 cin > > nodof;
058
059 ad[nodoi-1][nodof-1]=1;
060 ad[nodof-1][nodoi-1]=1;
061 }
062
063 //Matriz de Adyacencia
064 /* for(i=0;i < nds;i++)
065 { for(j=0;j < nds;j++)
066 ad[i][j]=ad[i][j];
067
068 }*/
069 }
070
071
072 void Greedy(int ad[][vertices],int nds)//,int ad[vertices][vertices])
073 {
074 ver v[nds];
075 int i,j,aux,zz,max=1;
076
077 //Etapa de Coloracion
078 for(i=0;i < nds;i++)
079 {v[i].color=1;
080 zz=0;
081 aux=1;
082 while(aux==1)
083 {for(j=0;j < nds;j++)
084 { if(ad[j][i]==1)
085 {if(v[i].color==v[j].color)
086 { zz=1;}
087 }
088 }
089 if(zz==1)
090 {aux=1;
091 zz=0;
092 v[i].color++;
093 }
094 else
095 {aux=0;}
096 if(v[i].color > max)
097 { max=v[i].color;}
098 }
099 }
100
101 cout < < "\n\tAlgoritmo Voraz \n" < < "\tmaxcolor= " < < max < <
"\n";
102
103 //Se imprime el conjunto de vertices de cada color
104 for(i=0;i < max;i++)
105 {printf("\t %c= { ",'a'+i);
106 for(j=0;j < nds;j++)
107 { if(v[j].color==i+1)
108 cout < < " " < < j+1;
109 }
110 cout < < " }\n";
111 }
http://blog.andresed.me/2015/08/algoritmos-de-coloracion-de-grafos.html 2/6
22/9/2018 ALGORITMOS DE COLORACIÓN DE GRAFOS - Making Code
}
112
113 }
114
115 void WelshPowell(int ad[][vertices],int nds)//,int ad[][vertices])
116 {
117 ver v[nds];
118 int x,y,i,j,aux,zz,max=1;
119 //Se inicializa el grado y color en cero
120 for(i=0;i < nds;i++)
121 { v[i].grado=0;
122 v[i].color=0;
123 v[i].n=i;
124 }
125 //Se encuentra el grado de los vertices.
126 for(i=0;i < nds;i++)
127 {for(j=0;j < nds;j++)
128 {if(ad[i][j]==1)
129 {v[i].grado++;
130 v[j].grado++;
131 //cout < < " " < < v[i].grado < < " " < < v[j].grado < <
endl;
132 }
133 }
134 }
135
136 for(i=0;i < nds;i++)
137 { v[i].grado=v[i].grado/2;
138 //cout < < " " < < v[i].grado < < endl;
139 B[i]=i;
140 }
141 //Ordenacion en funcion de sus grados!
142 OrdenarMayaMen(nds,v);
143 for(i=0;i < nds;i++)
144 v[i].n=B[i];
145
146 //Etapa de Coloracion
147 for(i=0;i < nds;i++)
148 {v[i].color=1;
149 zz==0;
150 aux=1;
151 while(aux==1)
152 { for(j=0;j < nds;j++)
153 { if(ad[v[j].n][v[i].n]==1)
154 {if(v[i].color==v[j].color)
155 {zz=1;}
156 }
157 }
158 if(zz==1)
159 {v[i].color++;
160 zz=0;
161 aux=1;
162 }else
163 {aux=0;
164 }
165 if(v[i].color > max)
166 {max=v[i].color;
167 }
http://blog.andresed.me/2015/08/algoritmos-de-coloracion-de-grafos.html 3/6
22/9/2018 ALGORITMOS DE COLORACIÓN DE GRAFOS - Making Code
}
168 }
169 }
170 //Se Imprime el Coloreo
171
172 cout < < "\n\tAlgoritmo de coloraci\xa2n Welsh-Powell\n" < <
"\tmaxcolor= " < < max < < "\n";
173
174 //Se imprime el conjunto de vertices de cada color
175 for(i=0;i < max;i++)
176 { printf("\t %c= { ",'a'+i);
177 for(j=0;j < nds;j++)
178 { if(v[j].color==i+1)
179 cout < < " " < < v[j].n+1;
180 }
181 cout < < " }\n";
182 }
183
184 }
185
186 void MMI(int ad[][vertices],int nds)//,int ad[][vertices])
187 {
188 ver v[nds];
189 int x,y,i,j,k,aux,zz,max=1;
190
191 //Se inicializa el grado y color en cero
192 for(i=0;i < nds;i++)
193 {v[i].grado=0;
194 v[i].color=0;
195 v[i].n=i+1;
196 }
197 //Se encuentra el grado de los vertices.
198 for(i=0;i < nds;i++)
199 {for(j=0;j < nds;j++)
200 { if(ad[i][j]==1)
201 {v[i].grado++;
202 v[j].grado++;
203 }
204 }
205 }
206
207 for(i=0;i < nds;i++)
208 v[i].grado=v[i].grado/2;
209
210 k=nds;
211 for(i=0;i < nds;i++)
212 { v[i].n=B[k-1];
213 k--;
214 }
215
216 //Etapa de Coloracion
217 //v[0].color=1;
218 for(i=0;i < nds;i++)
219 { v[i].color=1;
220 zz==0;
221 aux=1;
222 while(aux==1)
223 { for(j=0;j < nds;j++)
http://blog.andresed.me/2015/08/algoritmos-de-coloracion-de-grafos.html 4/6
22/9/2018 ALGORITMOS DE COLORACIÓN DE GRAFOS - Making Code
{ (j j j )
224 {if(ad[v[i].n][v[j].n])
225 { if(v[i].color==v[j].color)
226 {zz=1;}
227 }
228 }
229 if(zz==1)
230 { v[i].color++;
231 zz=0;
232 aux=1;
233 }else
234 {aux=0;}
235 if(v[i].color > max)
236 { max=v[i].color;}
237 }
238 }
239
240 //Se Imprime el Coloreo
241 cout < < "\n\tAlgoritmo de coloraci\xa2n Matula-Marble-Isaacson\n" < <
"\tmaxcolor= " < < max < < "\n";
242
243 //Se imprime el conjunto de vertices de cada color
244 for(i=0;i < max;i++)
245 {printf("\t %c= { ",'a'+i);
246 for(j=0;j < nds;j++)
247 { if(v[j].color==i+1)
248 cout < < " " < < v[j].n+1;
249 }
250 cout < < " }\n";
251 }
252
253 }
254
255 int main(int argc, char *argv[])
256 {
257 int i,j,cant_nodos,cant_aristas,ad[vertices][vertices];
258 char s,N,n;
259 do{
260 cout < < "\n\t\tALGORITMOS HEURISTICOS PARA EL COLOREADO DE GRAFOS\n";
261 cout < < "\t\t--------------------------------------------------\n";
262
263 cout < < "\n\n\t Ingrese Datos \n";
264 cout < < "\n\t Num. Nodos: ";
265 cin > > cant_nodos;
266 cout < < "\t Aristas: ";
267 cin > > cant_aristas;
268
269 //Aqui se crea la matriz de adyacencia
270 IngresarMatriz(ad,cant_nodos,cant_aristas);//,ad);
271 //Mostrar Matriz de Adyacencia
272 /* cout < < "\n\t";
273 for(i=0;i < nds;i++)
274 { for(j=0;j < nds;j++)
275 ad[i][j]=ad[i][j];
276 cout < < "\n\t";
277 }
278 */
279 //Se colorea vertice a vertice en el orden inicial
http://blog.andresed.me/2015/08/algoritmos-de-coloracion-de-grafos.html 5/6
22/9/2018 ALGORITMOS DE COLORACIÓN DE GRAFOS - Making Code

280 Greedy(ad,cant_nodos);//,ad);
281 //Se colorea vertice a vertice iniciando por los de mayor grado
282 WelshPowell(ad,cant_nodos);//,ad);
283 //Se colorea vertice a vertice iniciando por los de menor grado
284 MMI(ad,cant_nodos);//,ad);
285
286 cout < < "\n\tSi desea continuar presione cualquier tecla \n\tSi no
escriba 'n' o 'N': ";
287 s=getch();
288 system("cls");
289 }while(s!='N' && s!='n');
290 cout < < "Hasta Luego!!!!";
291 Sleep(1600);
292 exit(0);
293
294 cout < < "\n\n";
295 system("PAUSE");
296 }

http://blog.andresed.me/2015/08/algoritmos-de-coloracion-de-grafos.html 6/6

Das könnte Ihnen auch gefallen