Advertisement
Guest User

Untitled

a guest
Feb 19th, 2017
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.94 KB | None | 0 0
  1. /*
  2. Name: Kruskal.cpp
  3. Copyright: Cesar A. Rodriguez C.
  4. Author: Cesar A. Rodriguez C.
  5. Date: 09/10/16 21:11
  6. Description: Programa para la solución al problema correspondiente al objetivo 5 del Trabajo Practico de la Materia (324) 2016-1
  7. */
  8.  
  9. #include <stdlib.h>
  10. #include <conio.h>
  11. #include <iostream>
  12. #include <time.h>
  13.  
  14. const int N = 800;
  15. const int Ar = (N*N)/2;
  16.  
  17. int N_maquinas, N_aristas;
  18. int i, j, k, n = 1;
  19. int comp_u, comp_v;
  20. int aux;
  21. int contador;
  22.  
  23. int T[N];
  24. int Maquinas[N][N];
  25. int Conecta[N][N];
  26. int Adyacente[N][N];
  27. int componente[N][N];
  28.  
  29. struct edge{
  30. int a, u, v;
  31. };
  32.  
  33. edge arista[Ar];
  34. edge Aux[Ar];
  35.  
  36.  
  37.  
  38. void Matriz_Incidencia(int M){
  39. // Genera una matriz de 1 y 0 de dimensiones N_maquinas asignando la conexion entre vertices (Conectividad).
  40. // La matriz conectividad debe proporcionar una diagonal de ceros ya que los vertices en estos grafos no tiene bucles.
  41. // La matriz debe ser piramidal y es simetrica respecto a su diagonal.
  42.  
  43. system("cls");
  44. printf( "\n\n");
  45.  
  46. // Cabecera de la matriz
  47. printf(" Matriz de Incidencia \n\n");
  48. printf(" ");
  49. for(i = 1; i <= M; i++)
  50. printf( "%4d", i);
  51. printf("\n ");
  52. for(i = 1; i <= M; i++)
  53. printf(" _ _");
  54. printf( "\n\n");
  55.  
  56. for(i = 0; i < M; i++){
  57. if (i >= 9)
  58. printf(" %d \b| ", i+1);
  59. else
  60. printf(" %d | ", i+1);
  61. for(j = 0; j < M; j++){
  62. if(i==j){
  63. Conecta[i][j] = 0;
  64. printf("%4d", Conecta[i][j]);
  65. }
  66. else if (i < j){
  67. Conecta[i][j] = rand() %2;
  68. printf("%4d", Conecta[i][j]);
  69. }
  70. else if(i > j){
  71. Conecta[i][j] = Conecta[j][i];
  72. printf("%4d", Conecta[i][j]);
  73. }
  74. }
  75. printf( " | ");
  76. printf( "\n");
  77. };
  78. }
  79.  
  80.  
  81. int Verificar_Conexion(void){
  82. // Verifica si la matriz de incidencia posee vertices aislados. En tal caso genera una nueva matriz de incidencia.
  83. for(j = 0; j < N_maquinas; j++){
  84. for(i = 0; i < N_maquinas; i++){
  85. if(Conecta[i][j] == 1)
  86. break;
  87. else if(i == N_maquinas-1)
  88. return 1;
  89. }
  90. }
  91. }
  92.  
  93.  
  94. void Matriz_Ponderada(int M){
  95. // Crea una matriz con numeros aleatorios entre [1, 100] correspondiente a las distancia en kilometros.
  96. printf(" \n\n");
  97.  
  98. printf(" Matriz de Ponderacion (Kms.) \n\n");
  99.  
  100. for(i = 0; i < M; i++){
  101. if (i >= 9)
  102. printf(" %d \b| ", i+1);
  103. else
  104. printf(" %d | ", i+1);
  105.  
  106. for(j = 0; j < M; j++){
  107. if(i==j){
  108. Maquinas[i][j] = 0;
  109. printf("%4d", Maquinas[i][j]);
  110. }
  111. else if (i < j){
  112. Maquinas[i][j] = rand() %100 +1;
  113. printf("%4d", Maquinas[i][j]);
  114.  
  115. }
  116. else if(i > j){
  117. Maquinas[i][j] = Maquinas[j][i];
  118. printf("%4d", Maquinas[i][j]);
  119. }
  120. }
  121. printf( " | ");
  122. printf("\n");
  123. };
  124. }
  125.  
  126.  
  127. void Matriz_Adyacente(int M){
  128. // Genera una matriz la cual representa grafo no dirigido particular compuesto por la multiplicacion de las matrices de incidencia y distancia.
  129. printf(" \n\n");
  130. printf(" Matriz Adyacente \n\n");
  131.  
  132. for(i = 0; i < M; i++){
  133. if (i >= 9)
  134. printf(" %d \b| ", i+1);
  135. else
  136. printf(" %d | ", i+1);
  137.  
  138. for (j = 0; j < M; j++){
  139. Adyacente[i][j] = Maquinas[i][j] * Conecta[i][j];
  140. printf("%4d", Adyacente[i][j]);
  141. }
  142. printf( " | ");
  143. printf("\n");
  144. };
  145. }
  146.  
  147.  
  148. void Aristas(int M){
  149. //Registra todas las aristas del grafo (Matriz Adyacente)
  150. // aristas.a = peso de la arista; arista.u = vertice de origen; arista.v= vertice de llegada;
  151.  
  152. N_aristas=0;
  153. for(i = 0; i < M; i++){
  154. for(j = 0; j < M; j++){
  155. if(i < j){
  156. if(Adyacente[i][j] != 0){
  157. N_aristas++;
  158. arista[N_aristas].a = Adyacente[i][j];
  159. arista[N_aristas].u = i+1;
  160. arista[N_aristas].v = j+1;
  161. }
  162. }
  163. }
  164. }
  165. }
  166.  
  167.  
  168. void Ver_Aristas(void){
  169. // Imprime la Matriz de Aristas
  170. printf("\n\n");
  171.  
  172. for(i = 1; i <= N_aristas; i++)
  173. printf(" arista[%d] = (%d , %d) = %d \n", i, arista[i].u, arista[i].v, arista[i].a);
  174. }
  175.  
  176.  
  177. void Heapsort(void){
  178. //Ordenamos las aristas utilizando el metodo Heapsort
  179.  
  180. edge H[N_aristas];
  181. int temp, ult=0, x;
  182. arista[0].a=0;
  183. H[0].a=0;
  184.  
  185. for(k = 1; k <= N_aristas; k++){
  186.  
  187. ult = ult + 1;
  188. H[ult].a = arista[k].a;
  189. x = ult;
  190. while((x > 1) and (H[x].a < H[x/2].a)){
  191. temp = H[x].a;
  192. H[x].a = H[x/2].a;
  193. H[x/2].a = temp;
  194. x = x/2;
  195. }
  196. }
  197.  
  198. int Heapsort[N_aristas];
  199. int r;
  200. int ultimo;
  201.  
  202. for(k = 0; k <= N_aristas; k++){
  203.  
  204. Heapsort[k]=H[1].a; // Alamcenamos el dato que resulta ser el de menor valor entre todos.
  205. H[1].a = H[ult-k].a; // Reemplazamos la raiz por la hoja mas a la izquierda del ultimo nivel quebrando la propiedad de los arboles parcialmente ordenados
  206. H[ult-k].a = 0;
  207. ultimo = ult-k-1;
  208.  
  209. r = 1;
  210. while(r <= (ultimo/2)){
  211. if(ultimo == 2*r){
  212. if( H[r].a > H[2*r].a){
  213. aux = H[r].a;
  214. H[r].a = H[2*r].a;
  215. H[2*r].a = aux;
  216. r = ultimo;
  217. }
  218. else
  219. r = ultimo;
  220. }
  221. else
  222. if(H[r].a > H[2*r].a and H[2*r].a <= H[2*r+1].a){
  223. aux = H[r].a;
  224. H[r].a = H[2*r].a;
  225. H[2*r].a = aux;
  226. r = 2*r;
  227. }
  228. else if(H[r].a > H[2*r+1].a and H[2*r+1].a < H[2*r].a){
  229. aux = H[r].a;
  230. H[r].a = H[2*r+1].a;
  231. H[2*r+1].a = aux;
  232. r = 2*r+1;
  233. }
  234. else
  235. r = ultimo;
  236. }
  237. }
  238.  
  239. //Asignamos el orden a las aristas
  240.  
  241. for(k = 0; k < N_aristas; k++){
  242. contador = 1;
  243. for(i = 1; i <= N_aristas; i++){
  244. if(Heapsort[k] == arista[i].a){
  245. Aux[k+1].a = arista[i].a;
  246. Aux[k+1].u = arista[i].u;
  247. Aux[k+1].v = arista[i].v;
  248. arista[i].a = 0;
  249. contador++;
  250. break;
  251. }
  252. }
  253. }
  254.  
  255. for(i = 1; i <= N_aristas; i++){
  256. arista[i].a = Aux[i].a;
  257. arista[i].u = Aux[i].u;
  258. arista[i].v = Aux[i].v;
  259. }
  260.  
  261.  
  262. printf("\n\n Ordenando las Aristas: \n\n");
  263. for(i = 1; i <= N_aristas; i++)
  264. printf(" arista[%d] = (%d , %d) = %d \n", i, arista[i].u, arista[i].v, arista[i].a);
  265. printf("\n\n");
  266.  
  267. }
  268.  
  269.  
  270. void Iniciar_Componentes(void){
  271. // Inicio de las Componentes[] con los vertices
  272. for(i = 0; i <= N_maquinas; i++){
  273. for(j = 0; j <= N_maquinas; j++){
  274.  
  275. if(i == 1)
  276. componente[i][j]= j;
  277. else
  278. componente[i][j]= 0;
  279. }
  280. }
  281. }
  282.  
  283.  
  284.  
  285. void Iniciar_Ruta(void){
  286. // Inicio de las variables
  287. for(i = 0; i <= N_maquinas; i++)
  288. T[i]=0;
  289. }
  290.  
  291. void Ver_Ruta(int M){
  292. printf("\n\n");
  293.  
  294. for(i = 1; i <= M; i++)
  295. printf(" Trayecto[%d] = %d \n", i, T[i]);
  296.  
  297. }
  298.  
  299. void Ver_Componentes(void){
  300. // Imprime la matriz componente para verificar su correcto orden
  301. for(i = 1; i <= N_maquinas; i++){
  302. for(j = 1; j <= N_maquinas; j++)
  303. printf(" Comp[%d][%d] = %d", i, j, componente[i][j]);
  304. printf("\n");
  305. }
  306. }
  307.  
  308.  
  309. int Encuentra_U(void){
  310. int aux;
  311.  
  312. for(j = 1; j <= N_maquinas; j++)
  313. for(i = 1; i <= N_maquinas; i++)
  314. if(comp_u == componente[i][j])
  315. aux = j;
  316. return aux;
  317. }
  318.  
  319.  
  320.  
  321. int Encuentra_V(void){
  322. int aux;
  323. for(j = 1; j <= N_maquinas; j++)
  324. for(i = 1; i <= N_maquinas; i++)
  325. if(comp_v == componente[i][j])
  326. aux = j;
  327. return aux;
  328. }
  329.  
  330.  
  331. void Kruskal(int M){
  332. printf("\n\n");
  333.  
  334. printf("\n\n Iniciamos las componente \n\n");
  335. Iniciar_Ruta();
  336. Iniciar_Componentes();
  337. Ver_Componentes();
  338.  
  339. for(k = 1; k <= M; k++){
  340.  
  341. // Vertices que voy a buscar en los componentes
  342. comp_u = arista[k].u;
  343. comp_v = arista[k].v;
  344. printf("\n | Interaccion t= %d |\n", k);
  345. printf("------------------------------------------------------------------------------------------------------\n");
  346. printf("\n arista[%d] = (U, V) = (%d, %d) \n", k, comp_u, comp_v);
  347.  
  348. comp_u = Encuentra_U();
  349. comp_v = Encuentra_V();
  350.  
  351. printf(" Las aristas estan en los componentes [%d, %d]\n\n", comp_u, comp_v);
  352.  
  353.  
  354. // KRUSKAL
  355.  
  356. if (comp_u != comp_v){
  357. for(i = 1; i <= N_maquinas; i++)
  358. if(componente[i][comp_u] == 0)
  359. break;
  360. aux = 1;
  361. while(componente[aux][comp_v] != 0){
  362.  
  363. componente[i][comp_u] = componente[aux][comp_v];
  364. componente[aux][comp_v] = 0;
  365. i++;
  366. aux++;
  367. }
  368.  
  369. printf(" Ahora las componentes quedan de la siguiente manera: \n\n");
  370. Ver_Componentes();
  371.  
  372. T[n] = arista[k].a;
  373. printf("\n\n Trayecto[%d] = %d \n\n", n, T[n]);
  374. Aux[n].a = arista[k].a;
  375. Aux[n].u = arista[k].u;
  376. Aux[n].v = arista[k].v;
  377. n++;
  378. }
  379. }// fin for (KRUSKAL)
  380.  
  381. }
  382.  
  383. void Ver_Ruta_Aristas(int M){
  384. printf("\n\n");
  385.  
  386. for(n = 1; n <= N_maquinas; n++) {
  387. printf(" Arista[%d].a = %d ", n, Aux[n].a);
  388. printf("\t Arista[%d]= (%d , %d) \n", n, Aux[n].u, Aux[n].v);
  389. }
  390.  
  391. }
  392.  
  393. void Peso_Arbol(int M){
  394. printf("\n\n");
  395.  
  396. contador = 0;
  397. for(n = 1; n <= M; n++)
  398. contador = contador + Aux[n].a;
  399.  
  400. printf(" Peso del Arbol = %d", contador);
  401.  
  402. }
  403.  
  404.  
  405. int main()
  406. {
  407. srand(clock());
  408.  
  409. // Asignacion del numero de maquinas
  410. printf( " \n Numero de maquinas? : "); // Numero de maquinas MAXIMO es de 721. Comprobado.
  411. scanf("%d",&N_maquinas);
  412.  
  413. Matriz_Incidencia(N_maquinas);
  414. if(Verificar_Conexion() == 1)
  415. Matriz_Incidencia(N_maquinas);
  416.  
  417. Matriz_Ponderada(N_maquinas);
  418. Matriz_Adyacente(N_maquinas);
  419.  
  420. Aristas(N_maquinas);
  421. Ver_Aristas();
  422. Heapsort();
  423.  
  424. Kruskal(N_aristas);
  425.  
  426. Ver_Ruta(N_maquinas);
  427. Ver_Ruta_Aristas(N_maquinas);
  428. Peso_Arbol(N_maquinas);
  429.  
  430.  
  431.  
  432. printf("\n\n");
  433. system("pause");
  434. return 0;
  435. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement