Advertisement
Guest User

Untitled

a guest
Jul 22nd, 2017
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.11 KB | None | 0 0
  1. /* Colorarea unui graf cu un numãr dat de culori */
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5.  
  6. typedef struct e {
  7. int dest; /* nodul de la celalalt capat */
  8. struct e *next; /* urmatoarea muchie */
  9. } edge_t; /* tipul muchie */
  10.  
  11. typedef struct {
  12. int col; /* culoarea, initial zero */
  13. edge_t *links;/* muchiile cu care nodul e legat */
  14. } node_t; /* tipul unui nod */
  15.  
  16. int maxcol; /* nr. max. de culori */
  17. int maxnode; /* nr. max. de noduri */
  18.  
  19. node_t *g; /* graful e pointer la un tablou de noduri; va fi alocat */
  20.  
  21. int errmem(void) { perror("memorie insuficienta\n"); return 1; }
  22.  
  23. int goodcol(unsigned node, unsigned col)
  24. {
  25. edge_t *e;
  26. for (e = g[node].links; e; e = e->next)/* pentru toti vecinii lui node */
  27. if (g[e->dest].col == col) return 0; /* vecin cu aceeasi culoare */
  28. return 1; /* culoare buna, nu genereaza conflict */
  29. }
  30.  
  31. void ins_edge(unsigned src, unsigned dest) /* insereaza muchie in graf */
  32. {
  33. edge_t *e = malloc(sizeof(edge_t));
  34. if (!e) exit(errmem());
  35. e->dest = dest; e->next = g[src].links; g[src].links = e;
  36. }
  37.  
  38. void print(void)
  39. {
  40. unsigned n;
  41. printf("O colorare valida:\n");
  42. for (n = 0; n < maxnode; ++n)
  43. printf("Nodul %u cu culoarea %u\n", n, g[n].col);
  44. }
  45.  
  46. int trycolor(unsigned node) /* incearca colorarea lui node */
  47. {
  48. unsigned col;
  49. if (node == maxnode) { print(); return 1; }
  50. for (col = 1; col <= maxcol; ++col)
  51. if (goodcol(node, col)) {
  52. g[node].col = col;
  53. if (trycolor(node + 1)) return 1; /* daca am reusit, nu mai cautam */
  54. }
  55. g[node].col = 0;
  56. return 0;
  57. }
  58.  
  59. int main(void)
  60. {
  61. unsigned n1, n2;
  62.  
  63. printf("Datele se citesc -in ordinea:\nnr. noduri\nnr. culori\nperechi n1 n2 legate prin muchie\n");
  64. scanf("%u%u", &maxnode, &maxcol);
  65. /* consideram nodurile numerotate de la 0 */
  66. /* calloc initializeaza memoria alocata cu zero: si culoarea, si pointerul */
  67. if (!(g = calloc(maxnode, sizeof(node_t)))) return errmem();
  68. while (scanf("%u%u", &n1, &n2) == 2) {
  69. ins_edge(n1, n2);
  70. ins_edge(n2, n1);
  71. }
  72. if (!trycolor(0)) printf("Graful nu se poate colora cu %u culori\n", maxcol);
  73. return 0;
  74. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement