1+ #include <stdio.h>
2+ #include <string.h>
3+
4+ #define maxV 11
5+ #define maxC 5
6+ // a b c d e f g h i j k
7+ int graph [maxV ][maxV ] = {
8+ {0 , 1 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 }, // a
9+ {1 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }, // b
10+ {0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }, // c
11+ {0 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 1 }, // d
12+ {0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 }, // e
13+ {0 , 0 , 0 , 0 , 1 , 0 , 1 , 0 , 0 , 0 , 0 }, // f
14+ {0 , 0 , 0 , 0 , 0 , 1 , 0 , 1 , 0 , 0 , 1 }, // g
15+ {1 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 1 , 1 , 1 }, // h
16+ {0 , 0 , 0 , 1 , 0 , 0 , 0 , 1 , 0 , 1 , 0 }, // i
17+ {0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 0 , 1 }, // j
18+ {0 , 0 , 0 , 1 , 1 , 0 , 1 , 1 , 0 , 1 , 0 } // k
19+ };
20+
21+ int degree [maxV ]; // grau
22+ int color [maxV ]; // cor dos vértices
23+ int order [maxV ]; // ordem
24+
25+ void sort ()
26+ { // ordenação
27+ int i , j , aux ;
28+ for (i = 0 ; i < maxV ; i ++ )
29+ {
30+ for (j = maxV - 1 ; j > i ; j -- )
31+ {
32+ if (degree [order [j ]] > degree [order [j - 1 ]])
33+ {
34+ aux = order [j ];
35+ order [j ] = order [j - 1 ];
36+ order [j - 1 ] = aux ;
37+ }
38+ }
39+ }
40+ }
41+
42+ void init ()
43+ {
44+ int i ;
45+ for (i = 0 ; i < maxV ; i ++ )
46+ {
47+ degree [i ] = 0 ;
48+ }
49+ for (i = 0 ; i < maxV ; i ++ )
50+ {
51+ order [i ] = i ;
52+ }
53+ for (i = 0 ; i < maxV ; i ++ )
54+ {
55+ color [i ] = 0 ;
56+ }
57+ }
58+
59+ void countDegree ()
60+ {
61+ int i , j ;
62+ init ();
63+ for (i = 0 ; i < maxV ; i ++ )
64+ {
65+ degree [i ] = 0 ;
66+ }
67+ for (i = 0 ; i < maxV ; i ++ )
68+ {
69+ order [i ] = i ;
70+ }
71+
72+ for (i = 0 ; i < maxV ; i ++ )
73+ {
74+ for (j = 0 ; j < maxV ; j ++ )
75+ {
76+ if (graph [i ][j ] == 1 )
77+ degree [i ]++ ;
78+ }
79+ }
80+ sort ();
81+ }
82+
83+ void printWP ()
84+ {
85+ int i ;
86+ printf ("Vértices em ordem de 0 a %d \n\n" , maxV - 1 );
87+ for (i = 0 ; i < maxV ; i ++ )
88+ {
89+ printf ("Vértice %d tem grau %d e a cor dele é %d\n" , i , degree [i ], color [i ]);
90+ }
91+ printf ("\n-----------------------------------------\n" );
92+ printf ("Vértices ordenados por grau\n\n" );
93+ for (i = 0 ; i < maxV ; i ++ )
94+ {
95+ printf ("Vértice %d tem grau %d e a cor dele é %d\n" , order [i ], degree [order [i ]], color [order [i ]]);
96+ }
97+ }
98+
99+ void welshPowell ()
100+ {
101+ int i , j , k , o ;
102+ int vColor [maxC ];
103+ countDegree ();
104+ for (i = 0 ; i < maxV ; i ++ )
105+ { // percorrer a ordem dos vetores
106+ o = order [i ];
107+ memset (vColor , 0 , sizeof (vColor ));
108+ for (j = 0 ; j < maxV ; j ++ )
109+ { // percorrer as adjacencias
110+ if (graph [o ][j ] == 1 && color [j ] != 0 )
111+ { // verificar a cor do vizinho
112+ vColor [color [j ]] = 1 ;
113+ }
114+ }
115+ k = 1 ;
116+ while (color [o ] == 0 )
117+ {
118+ if (vColor [k ] == 0 )
119+ {
120+ color [o ] = k ;
121+ }
122+ k ++ ;
123+ }
124+ }
125+ printWP ();
126+ }
127+
128+ int main ()
129+ {
130+ welshPowell ();
131+ return 0 ;
132+ }
0 commit comments