Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

Graficas K Coloreables

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 3

1 /*EN ESTE ALGORITMO SE LE ASUGNA UNA LA MENOR K COLORACION A UNA GRAFICA*/

2 #include<iostream>
3 #include<ctype.h>
4 #include<process.h>
5 #include<stdlib.h>
6
7 using namespace std;
8 #define maxi 20
9
10 struct nodo
11 {int clave;
12 struct nodo *siguiente;};
13
14 class Cola
15 {
16 public:
17 Cola(int);
18 void poner(int);
19 int obtener(void);
20 int vacia(void);
21 private:
22 int *cola,talla,cabeza,rabo;
23 };
24
25 Cola::Cola(int n)
26 {
27 cola=new int[n+1];
28 talla=n+1;
29 cabeza=0;
30 rabo=0;
31 }
32
33 void Cola::poner(int q)
34 {
35 cola[++rabo]=q;
36 if(rabo>talla)
37 rabo=0;
38 }
39
40 int Cola::obtener(void)
41 {
42 ++cabeza;
43 int x2=cola[cabeza];
44 if(cabeza>talla)
45 cabeza=0;
46 return x2;
47 }
48
49 int Cola::vacia()
50 {
51 return cabeza==rabo;
52 }
53
54 struct nodo *ady[maxi],*t,*z;
55 int x1,v,j,a,coloracion[maxi]={0},colores_usados[maxi],indicador[maxi]={0},id=0;
56 char c;
57 void listady();
58 int indice(char c);
59 char nombre(int n);
60 int minimo_no_usado(int r);
61 void colorear(int s);
62 Cola cola(maxi);
63
64 main()
65 {
66 setlocale(LC_ALL,""); // Reconoce acentos
67 listady();
68 cout<<"¿Con que vertice se empezará la coloracion?\n";
69 cin>>c;
70 c=toupper(c);
71 x1=indice(c);
72 colorear(x1);
73 cout<<"La k-coloración de la grafica es:\n";
74 cout<<"\n\tvértice\t\tcolor";
75 for(j=1;j<=v;j++)
76 cout<<"\n\t "<<nombre(j)<<"\t\t"<<coloracion[j];
77 return 0;
78 }
79
80 void listady()
81 {
82 int i,j,x,y;
83 char v1,v2,v3,v4;
84 cout<<"Da el nùmero de vértices de la gráfica:\n";
85 cin>>v;
86 cout<<"Da el número de aristas de la gráfica:\n";
87 cin>>a;
88 z=new nodo;
89 z->siguiente=z;
90 for(j=1;j<=v;j++)
91 ady[j]=z;
92 for(i=1;i<=a;i++)
93 {cout<<"escribe la arista"<<i<<"(con letras):\n";
94 cin>>v3>>v4;
95 v1=toupper(v3);
96 v2=toupper(v4);
97 x=indice(v1);
98 y=indice(v2);
99 t=new nodo;
100 t->clave=x;
101 t->siguiente=ady[y];
102 ady[y]=t;
103 t=new nodo;
104 t->clave=y;
105 t->siguiente=ady[x];
106 ady[x]=t;
107 }
108
109 for(i=1;i<=v;i++)
110 {
111 cout<<nombre(i)<<":";
112 for(t=ady[i];t!=z;t=t->siguiente)
113 cout<<nombre(t->clave)<<"->";
114 cout<<"\n";
115 }
116 }
117
118 int indice(char c)
119 {
120 int m=0;
121 char k;
122 for(k='A';k<=c;k++)
123 m++;
124 return m;
125 }
126
127 char nombre(int n)
128 {
129 char q='A';
130 int i;
131 for(i=1;i<=n-1;i++)
132 q++;
133 return q;
134 }
135
136 void colorear(int s)
137 {
138 int p,u,m;
139 coloracion[s]=1;
140 cola.poner(s);
141 do
142 {
143 s=cola.obtener();
144 p=0;
145 for(u=1;u<=v; u++)
146 if(!coloracion[u])
147 {
148 cola.poner(u);
149 break;
150 }
151 if(u<=v)
152 {
153 for(t=ady[u];t!=z;t=t->siguiente)
154 if(coloracion[t->clave])
155 {
156 p++;
157 colores_usados[p]=coloracion[t->clave];
158 }
159 m=minimo_no_usado(p);
160 coloracion[u]=m;
161 //break;
162 }
163 }while(!cola.vacia());
164 }
165
166 int minimo_no_usado(int r)
167 {
168 int n1,mini=1,encontrado;
169 for(;;)//ciclo infinito
170 {
171 encontrado=1;
172 for(n1=1;n1<=r;n1++)
173 if(mini==colores_usados[n1])
174 {
175 encontrado=0;
176 break;
177 }
178 if(encontrado)
179 break;
180 mini++;
181 }
182 return mini;
183 }
184
185
186
187
188
189
190
191

También podría gustarte