#include <EWS/graph.h> int iscomplete(nbl) ULONG *nbl; { ULONG knoten = nbl[0]-1; if (nbl[knoten] == (knoten + 1 + knoten * (knoten -1))) return TRUE; return FALSE; } int compint(a,b) ULONG *a,*b; { return *a - *b; } verschmelze_knoten(pnbl,i,j) ULONG i,j; ULONG **pnbl; { ULONG *nbl = *pnbl, *nn; int k,l,ll,m,beide; ULONG knoten_nn, knoten_nbl; knoten_nbl=nbl[0]-1; knoten_nn=knoten_nbl-1; if (i>j) { k=i; i=j; j=k; } m=knoten_nbl; nn = (ULONG *)EWS_malloc(nbl[nbl[0]-1] * sizeof(ULONG)); for (k=0;k<knoten_nbl;k++) qsort(nbl+nbl[k],nbl[k+1]-nbl[k], sizeof(ULONG),compint); for (k=0;k<i;k++) { nn[k]=m; beide=0; for (l=nbl[k];l<nbl[k+1];l++) { if ((nbl[l] == j) && (beide == 1)) continue; if (nbl[l]==i) beide=1; if (nbl[l]==j) nn[m++]=i; else nn[m++]=(nbl[l]>j?nbl[l]-1:nbl[l]); } } /* knoten i */ { nn[i]=m; l = nbl[i]; ll=nbl[j]; while (l<nbl[i+1] && ll<nbl[j+1]) { if (nbl[l] < nbl[ll]) { nn[m++]=(nbl[l]>j?nbl[l]-1:nbl[l]); l++; } else if (nbl[ll] < nbl[l]) { nn[m++]=(nbl[ll]>j?nbl[ll]-1:nbl[ll]); ll++; } else { nn[m++]=(nbl[ll]>j?nbl[ll]-1:nbl[ll]); ll++; l++; } } while (l<nbl[i+1]) { nn[m++]=(nbl[l]>j?nbl[l]-1:nbl[l]); l++; } while (ll<nbl[j+1]) { nn[m++]=(nbl[ll]>j?nbl[ll]-1:nbl[ll]); ll++; } } for (k=i+1;k<j;k++) { nn[k]=m; beide=0; for (l=nbl[k];l<nbl[k+1];l++) { if ((nbl[l] == j) && (beide == 1)) continue; if (nbl[l]==i) beide=1; if (nbl[l]==j) nn[m++]=i; else nn[m++]=(nbl[l]>j?nbl[l]-1:nbl[l]); } } /* knoten j wird ausgelassen */ for (k=j+1;k<knoten_nbl;k++) { nn[k-1]=m; beide=0; for (l=nbl[k];l<nbl[k+1];l++) { if ((nbl[l] == j) && (beide == 1)) continue; if (nbl[l]==i) beide=1; if (nbl[l]==j) nn[m++]=i; else nn[m++]=(nbl[l]>j?nbl[l]-1:nbl[l]); } } nn[knoten_nn]=m; EWS_free(nbl); *pnbl=nn; } faerbe(pnbl,farben,anz) ULONG **pnbl; int ***farben; int *anz; { ULONG knoten, *new_nbl; ULONG *nbl = *pnbl; int **new_farben; int new_anz; int i,j,k,l,m; *farben = (int **) NULL; knoten=nbl[0]-1; if (iscomplete(nbl) == TRUE) { *farben = (int **)EWS_malloc(sizeof (int *)); (*farben)[0] = (int *)EWS_malloc(knoten * sizeof(int)); for (i=0;i<knoten;i++) ((*farben)[0])[i]=i+1; *anz =1 ; return; } /* such ein paar von knoten, die nicht verknuepft sind */ for (i=0;i<knoten;i++) if (nbl[i+1]-nbl[i] < (knoten -1)) /* dann fehlt ein knoten */ { qsort(nbl+nbl[i],nbl[i+1]-nbl[i],sizeof(ULONG),compint); /* sortiert */ for (j=0;j<nbl[i+1]-nbl[i];j++) { if (j<i) { if (nbl[nbl[i]+j] >j ) /* paar gefunden */ goto aaa; } else if (j>=i) { if (nbl[nbl[i]+j] >(j+1) ) /* paar gefunden */ { j++; goto aaa; } } } /* die ersten nbl[i+1]-nbl[i] kanten sind da */ if (i<=j) j++; goto aaa; } aaa: /* die kanten (i,j) fehlt */ fuege_kante_ein(pnbl,i,j); faerbe(pnbl,farben,anz); loesche_kante(pnbl,i,j); /* farbe gefunden */ /* nun mit verschmelzen probieren */ nbl=*pnbl; new_nbl = (ULONG*)EWS_malloc(nbl[nbl[0]-1] * sizeof (ULONG)); memcpy(new_nbl,nbl, nbl[nbl[0]-1] * sizeof (ULONG)); verschmelze_knoten(&new_nbl,i,j); faerbe(&new_nbl,&new_farben,&new_anz); EWS_free(new_nbl); if (new_anz > 0) { *anz = *anz+new_anz; *farben = (int **) realloc(*farben,*anz * sizeof(int *)); for (k=0;k<new_anz;k++) { (*farben)[*anz-k-1] = (int *)EWS_malloc(knoten * sizeof(int)); for (l=0;l<knoten;l++) { if (l==j) ((*farben)[*anz-k-1])[l]=new_farben[k][i]; else if (l<j) ((*farben)[*anz-k-1])[l]=new_farben[k][l]; else ((*farben)[*anz-k-1])[l]=new_farben[k][l-1]; } EWS_free(new_farben[k]); } EWS_free(new_farben); } } main() { ULONG *nbl; int **f,i,j; nbl=random_nbl_einfach(6); /* scan_nachbarschafts_liste_ulong(&nbl); */ print_nachbarschafts_liste_ulong(nbl); faerbe(&nbl,&f,&j); for (;j>0;j--) { for (i=0;i<nbl[0]-1;i++) printf(" %d ",(f[j-1])[i]); EWS_free(f[j-1]); printf("\n"); } EWS_free(nbl); EWS_free(f); }