Thuật toán SDO (Saturation Degree Ordering) : do Brèlaz đề xuất năm 1979 [12]. Đây cũng là một thuật toán tô mầu tuần tự các đỉnh. SDO cải tiến FF ở chỗ các đỉnh được tô mầu không theo số thứ tự của đỉnh, mà theo thứ tự bậc SD từ lớn tới bé. Trong đó bậc SD của đỉnh x được tính bằng số mầu khác nhau đã dùng để tô cho các đỉnh kề với x.
Chương trình:
#include #include #include int *doc_tep(int *a,int *n);void in_matran(int *a,int n);int *bac_dinh(int *a,int n);int max(int *b,int n);int ktra_mau(int *a,int *b,int *c,int n,int x);void ToMau(int *a,int n);int main(){int n,*a;a=doc_tep(a,&n);in_matran(a,n);ToMau(a,n);getch();return 0;}int *doc_tep(int *a,int *n){FILE *f;f=fopen("Graph1.INP","r");if(f==NULL){printf("nLoi Mo Tep.");getch();exit(1);}fscanf(f,"%d",n);a=(int *) malloc(*n**n*sizeof(int));for(int i=0;i<*n;i++)for(int j=0;j<*n;j++)fscanf(f,"%d",(a+i**n+j));fclose(f);return a;}void in_matran(int *a,int n){for(int i=0;i{for(int j=0;jprintf("%5d",*(a+i*n+j));printf("nn");}}int *bac_dinh(int *a,int n){int *deg;int *b;b=(int *) calloc(n*n,sizeof(int));for(int i=0;ifor(int j=0;jif(*(a+i*n+j)!=0){*(b+i*n+j)=*(a+i*n+j);*(b+j*n+i)=*(a+i*n+j);}printf("n");//in_matran(b,n);deg=(int *) calloc(n,sizeof(int));for(int i=0;ifor(int j=0;j{if(*(b+i*n+j)!=0 && i!=j)deg[i]+=*(b+i*n+j);if(*(b+i*n+j)!=0 && i==j)deg[i]+=*(b+i*n+j)*2;}//for(int i=0;i// printf("nBac cua dinh %d la %d.",i+1,deg[i]);return deg;}int max(int *b,int n){int tg=*b,j=0;for(int i=1;iif(*(b+i)>tg){tg=*(b+i);j=i;}return j;}int ktra_mau(int *a,int *b,int *c,int n,int d,int x) //Kiem tra mau x da to cho cac dinh ke voi dinh d chua{for(int j=0;jif((*(a+d*n+j)!=0 && j!=d) && *(b+j)==x) //c[]:danh dau dinh j da to maureturn 0; //b[]return 1;}void in(int *b,int n){printf("n");for(int k=0;kprintf("%5d",*(b+k));}void ToMau(int *a,int n){int *b,*c,*deg,tg;b=(int *) calloc (n,sizeof(int));c=(int *) calloc (n,sizeof(int));deg=bac_dinh(a,n);for(int i=0;i{tg=max(deg,n);printf("ntg=%d",tg);for(int j=0;jif(ktra_mau(a,b,c,n,tg,j)==1){*(b+tg)=j;*(c+tg)=1;break;}*(deg+tg)=0;//in(deg,n);}printf("nTo Mau Cho Do Thi: n");for(int i=0;iprintf("ntDinh %d ---> Mau %d",i+1,*(b+i));}
Theo lập trình việt






0 nhận xét:
Đăng nhận xét