题目
思路
- 首先对一个多边形进行着色,着色后判断是否满足要求,如果满足要求则继续对其他多边形进行着色
- 如果不满足要求则撤销当前着色并回溯,采用其他着色方案
- 递归如此,直到地图全部着色完成
验证四色定理
#include<stdio.h>
#include<stdlib.h>
#define MAX_VERTEX_NUM 20
typedef enum{ None, Red, Green, Blue, Yellow }GraphColor;
typedef struct ArcNode{
int adjvex;
struct ArcNode *nextarc;
}ArcNode;
typedef char VertexType;
typedef struct VNode{
VertexType data;
ArcNode *firstarc;
int color;
}VNode, AdjList[MAX_VERTEX_NUM+1];
typedef struct{
AdjList vertices;
int vexnum, arcnum;
}ALGraph;
int LocateVex_AL(ALGraph G, VertexType u){
int i;
for(i=1; i<=G.vexnum; i++){
if(G.vertices[i].data==u)
return i;
}
return 0;
}
int CreateUDG(FILE *fp, ALGraph *G){
int i, j, k;
VertexType v1, v2;
char tmp;
ArcNode *p, *q;
ArcNode *r[MAX_VERTEX_NUM+1];
fscanf(fp, "%d%d", &((*G).vexnum), &((*G).arcnum));
fscanf(fp, "%c", &tmp);
fscanf(fp, "%c", &tmp);
for(i=1; i<=(*G).vexnum; i++){
fscanf(fp, "%c", &((*G).vertices[i].data));
(*G).vertices[i].firstarc = NULL;
(*G).vertices[i].color = None;
r[i] = NULL;
}
for(k=1; k<=(*G).arcnum; k++){
fscanf(fp, "%c", &tmp);
fscanf(fp, "%c%c", &v1, &v2);
i = LocateVex_AL(*G, v1);
j = LocateVex_AL(*G, v2);
if(!i || !j)
return 0;
p = (ArcNode *)malloc(sizeof(ArcNode));
if(!p)
exit(0);
p->adjvex = j;
p->nextarc = NULL;
if(r[i]==NULL)
(*G).vertices[i].firstarc = p;
else
r[i]->nextarc = p;
r[i] = p;
q = (ArcNode *)malloc(sizeof(ArcNode));
if(!q)
exit(0);
q->adjvex = i;
q->nextarc = NULL;
if(r[j]==NULL)
(*G).vertices[j].firstarc = q;
else
r[j]->nextarc = q;
r[j] = q;
}
return 1;
}
int isColorOK(ALGraph G, int nodeOrder) {
ArcNode *p =G.vertices[nodeOrder].firstarc;
while(p){
if(G.vertices[nodeOrder].color == G.vertices[p->adjvex].color)
return 0;
p = p->nextarc;
}
return 1;
}
int getColorPowset(ALGraph *G, int colorNum, int step, VertexType vex, int tarColor) {
int i,pos;
pos = LocateVex_AL(*G, vex);
if(step > (*G).vexnum){
if((*G).vertices[pos].color == tarColor){
return 1;
}
}
else{
for(i = 1; i<=colorNum; i++){
(*G).vertices[step].color = i;
if(isColorOK(*G, step)){
if(getColorPowset(G, colorNum, step+1, vex, tarColor))
return 1;
}
(*G).vertices[step].color = None;
}
}
return 0;
}
void OutputALGraph(ALGraph G){
int i, j;
ArcNode *p;
if(!G.vexnum && !G.arcnum)
printf("空图(表)!\n");
else{
for(i=1; i<=G.vexnum; i++){
printf("%c→", G.vertices[i].data);
p = G.vertices[i].firstarc;
while(p){
printf(" %c", G.vertices[p->adjvex].data);
p = p->nextarc;
}
printf("\n");
}
}
}
void showResult(ALGraph G){
int i, j;
ArcNode *p;
if(!G.vexnum && !G.arcnum)
printf("空图(表)!\n");
else{
for(i=1; i<=G.vexnum; i++){
printf("区域%c→→颜色%d\n", G.vertices[i].data, G.vertices[i].color);
}
}
}
int main(){
ALGraph G;
FILE *fp;
int vex, tarColor;
printf("创建无向图...\n");
fp = fopen("2015-08_UDG_AL.txt", "r");
CreateUDG(fp, &G);
fclose(fp);
printf("\n");
printf("输出图的邻接表 G = \n");
OutputALGraph(G);
printf("可选区域:A,B,C,D,E\n");
printf("可选颜色:1【红】,2【绿】,3【蓝】,4【黄】\n");
printf("请输入一种着色方案【例如:A 1】:");
scanf("%c%d", &vex, &tarColor);
if(getColorPowset(&G, 4, 1, vex, tarColor)) {
printf("染色成功,其中一种方案如下:\n");
showResult(G);
}
else
printf("染色失败,方案不正确\n");
return 1;
}
输出所有染色方案
#include<stdio.h>
#include<stdlib.h>
#define MAX_VERTEX_NUM 20
int order;
typedef enum{ None, Red, Green, Blue, Yellow }GraphColor;
typedef struct ArcNode{
int adjvex;
struct ArcNode *nextarc;
}ArcNode;
typedef int VertexType;
typedef struct VNode{
VertexType data;
ArcNode *firstarc;
int color;
}VNode, AdjList[MAX_VERTEX_NUM+1];
typedef struct{
AdjList vertices;
int vexnum, arcnum;
}ALGraph;
int LocateVex_AL(ALGraph G, VertexType u){
int i;
for(i=1; i<=G.vexnum; i++){
if(G.vertices[i].data==u)
return i;
}
return 0;
}
int CreateUDG(FILE *fp, ALGraph *G){
int i, j, k;
VertexType v1, v2;
char tmp;
ArcNode *p, *q;
ArcNode *r[MAX_VERTEX_NUM+1];
fscanf(fp, "%d%d", &((*G).vexnum), &((*G).arcnum));
for(i=1; i<=(*G).vexnum; i++){
fscanf(fp, "%d", &((*G).vertices[i].data));
(*G).vertices[i].firstarc = NULL;
(*G).vertices[i].color = None;
r[i] = NULL;
}
for(k=1; k<=(*G).arcnum; k++){
fscanf(fp, "%d%d", &v1, &v2);
i = LocateVex_AL(*G, v1);
j = LocateVex_AL(*G, v2);
if(!i || !j)
return 0;
p = (ArcNode *)malloc(sizeof(ArcNode));
if(!p)
exit(0);
p->adjvex = j;
p->nextarc = NULL;
if(r[i]==NULL)
(*G).vertices[i].firstarc = p;
else
r[i]->nextarc = p;
r[i] = p;
q = (ArcNode *)malloc(sizeof(ArcNode));
if(!q)
exit(0);
q->adjvex = i;
q->nextarc = NULL;
if(r[j]==NULL)
(*G).vertices[j].firstarc = q;
else
r[j]->nextarc = q;
r[j] = q;
}
return 1;
}
void OutputALGraph(ALGraph G){
int i, j;
ArcNode *p;
if(!G.vexnum && !G.arcnum)
printf("空图(表)!\n");
else{
for(i=1; i<=G.vexnum; i++){
printf("%d→", G.vertices[i].data);
p = G.vertices[i].firstarc;
while(p){
printf(" %d", G.vertices[p->adjvex].data);
p = p->nextarc;
}
printf("\n");
}
}
}
void showResult(ALGraph G){
int i, j;
ArcNode *p;
if(!G.vexnum && !G.arcnum)
printf("空图(表)!\n");
else{
for(i=1; i<=G.vexnum; i++){
printf("区域%d→→颜色%d\n", G.vertices[i].data, G.vertices[i].color);
}
}
}
int isColorOK(ALGraph G, int nodeOrder) {
ArcNode *p =G.vertices[nodeOrder].firstarc;
while(p){
if(G.vertices[nodeOrder].color == G.vertices[p->adjvex].color)
return 0;
p = p->nextarc;
}
return 1;
}
int getColorPowset(ALGraph *G, int colorNum, int step){
int i;
if(step > (*G).vexnum){
printf("地图染色问题的第 %d 种解法...\n", ++order);
showResult(*G);
}
else{
for(i = 1; i<=colorNum; i++){
(*G).vertices[step].color = i;
if(isColorOK(*G, step))
getColorPowset(G, colorNum, step+1);
(*G).vertices[step].color = None;
}
}
return 0;
}
int main(){
ALGraph G;
FILE *fp;
int vex, tarColor;
printf("创建无向图...\n");
fp = fopen("2015-08-02_UDG_AL.txt", "r");
CreateUDG(fp, &G);
fclose(fp);
printf("\n");
printf("输出图的邻接表 G = \n");
OutputALGraph(G);
printf("染色区域:1,2,3,4,5\n");
printf("可染颜色:1【红】,2【绿】,3【蓝】,4【黄】\n");
printf("所有染色方案如下:\n");
getColorPowset(&G, 4, 1);
return 1;
}