题目如下:
已知一个图G和m>0种颜色,只准使用这m种颜色对G的结点着色,并使图中任何相邻的两个结点都具有不同的颜色。求在最多使用m种颜色的情况下,可以对一给定的图着色的所有不同方法。
程序如下:
#include<stdio.h>
int m,n,i,j,a=0;
int x[100]={0},G[100][100]={0};
NEXTVALUE(int k)
{
int h;
for(h=0;h<m+1;h++)
{
x[k]=(x[k]+1)%(m+1);
for(j=0;j<n;j++)
{
if(G[k][j]&&(x[k]==x[j]))
break;
}
if(j==n)
break;
}
if(j==n) return(x[k]);
if(h==m+1) return(0);
}
void MCOLORING(int k)
{
while(k<n)
{
x[k]=NEXTVALUE(k);
if(x[k]==0)
{
x[k]=m+1;
break;
}
if(k==(n-1))
{a++;
for(j=0;j<n;j++)
printf("%d",x[j]);
printf("\n");
}
else
{
MCOLORING(k+1);
}}
}
void main()
{
printf("m=");
scanf("%d",&m);
printf("n=");
scanf("%d",&n);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{printf("G[%d][%d]=",i,j);
scanf("%d",&G[i][j]);
}
MCOLORING(0);
printf("total=%d",a);
}
请高手们帮忙看下问题在哪?
16 个解决方案
#1
要枚举所有可能,
好好看看递规
好好看看递规
#2
我还是弄不懂问题出在哪里?能直接帮我改下吗?谢谢了~!
#3
程序上传的不正规,还是书写就不好!看的累!
#4
有时间看看吧..
#5
偶也是菜鸟
初学C语言 看不懂你的程序```` 惭愧`惭愧``
初学C语言 看不懂你的程序```` 惭愧`惭愧``
#6
有时间看看
#7
说说你程序的思想好么?看了好久,不明白
#8
#include <iostream>
#include <stdlib.h>
using namespace std;
int m,n,i,j,a=0;
int x[100]={0},G[100][100]={0};
int NEXTVALUE(int k)
{
int h;
for(h=0;h<m+1;h++)
{
x[k]=(x[k]+1)%(m+1);
for(j=0;j<n;j++)
{
if(G[k][j]&&(x[k]==x[j]))
break;
}
if(j==n)
break;
}
if(j==n) return(x[k]);
if(h==m+1) return(0);
}
void MCOLORING(int k)
{
while(k<n)
{
x[k]=NEXTVALUE(k);
if(x[k]==0)
{
x[k]=m+1;
break;
}
if(k==(n-1))
{a++;
for(j=0;j<n;j++)
printf("%d",x[j]);
printf("\n");
}
else
{
MCOLORING(k+1);
}}
}
int main(int argc, char *argv[])
{
printf("m=");
scanf("%d",&m);
printf("n=");
scanf("%d",&n);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{printf("G[%d][%d]=",i,j);
scanf("%d",&G[i][j]);
}
MCOLORING(0);
printf("total=%d",a);
system("PAUSE");
return 0;
}
#include <stdlib.h>
using namespace std;
int m,n,i,j,a=0;
int x[100]={0},G[100][100]={0};
int NEXTVALUE(int k)
{
int h;
for(h=0;h<m+1;h++)
{
x[k]=(x[k]+1)%(m+1);
for(j=0;j<n;j++)
{
if(G[k][j]&&(x[k]==x[j]))
break;
}
if(j==n)
break;
}
if(j==n) return(x[k]);
if(h==m+1) return(0);
}
void MCOLORING(int k)
{
while(k<n)
{
x[k]=NEXTVALUE(k);
if(x[k]==0)
{
x[k]=m+1;
break;
}
if(k==(n-1))
{a++;
for(j=0;j<n;j++)
printf("%d",x[j]);
printf("\n");
}
else
{
MCOLORING(k+1);
}}
}
int main(int argc, char *argv[])
{
printf("m=");
scanf("%d",&m);
printf("n=");
scanf("%d",&n);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{printf("G[%d][%d]=",i,j);
scanf("%d",&G[i][j]);
}
MCOLORING(0);
printf("total=%d",a);
system("PAUSE");
return 0;
}
#9
for(h=0;h<m+1;h++)
{
x[k]=(x[k]+1)%(m+1);
for(j=0;j<n;j++)
{
if(G[k][j]&&(x[k]==x[j]))
break;
}
if(j==n)
break;
}
if(j==n) return(x[k]);
if(h==m+1) return(0);
其中if(G[k][j]&&(x[k]==x[j])) 的判断条件是不行的,你只要两个相邻的格子不同。。
你的这种判断过度!!
{
x[k]=(x[k]+1)%(m+1);
for(j=0;j<n;j++)
{
if(G[k][j]&&(x[k]==x[j]))
break;
}
if(j==n)
break;
}
if(j==n) return(x[k]);
if(h==m+1) return(0);
其中if(G[k][j]&&(x[k]==x[j])) 的判断条件是不行的,你只要两个相邻的格子不同。。
你的这种判断过度!!
#10
惭愧``
#11
谢谢wwxsoft(婉儿),但是你的程序不能运行,提示为:
"Parameter 'argv' is never used in function main
Parameter 'argc' is never used in function main"
"Parameter 'argv' is never used in function main
Parameter 'argc' is never used in function main"
#12
我程序的思想如下:
我用的是递归算法来解决,使用函数MCOLORING和NEXTVALUE。其中全局变量为使用颜色的种数m,结点的个数n,图形的布尔值GRAPH(1:n,1:n)和每个结点的赋值X[i]。
首先使用主函数调用MCOLORING(k)函数,由MCOLORING函数调用NEXTUALUE(k)函数,如果X[i]不等于0,则再由MCOLORING(k)调MCOLORING(k+1)函数,以此实现递归调用。
由用户输入颜色的数量和图G中所有结点的关系,例如:若i与j相互连结,则GRAPH[i][j]=1,否则GRAPH[i][j]=0。因为有m种颜色,所以每个结点都可以着m种颜色。
在MCOLORIG(k)中递归调用MCOLORING(k+1),并且输出每个结点着的颜色,用数组x[5]表示。在最初调用MCOLORING(0)时,应对图的邻接矩阵GRAPH[n][n]置初值并对数组x[n]置0值。
在进入函数NEXTVALUE(k)前,假设X(1),X(2),……X(k-1)都已分得了区域[1,m]中的整数且相邻的结点有不同的整数,此函数的目的是在区域
[0,m]中给X(k)确定一个值:如果还剩下一些颜色,它们与结点k邻接的结点分配的颜色不同,那么就将其中最高标值的颜色分配给结点k;如果没剩下可用的颜色,则置X(k)为0。
在主函数中给出m,N的取值以及GRAPH(1:n,1:n)的的布尔值,并且调用MXOLORING(0)。
我是初学者,还没入门,所以编写的程序不很规范,请高手们原谅,日后一定改正。
我用的是递归算法来解决,使用函数MCOLORING和NEXTVALUE。其中全局变量为使用颜色的种数m,结点的个数n,图形的布尔值GRAPH(1:n,1:n)和每个结点的赋值X[i]。
首先使用主函数调用MCOLORING(k)函数,由MCOLORING函数调用NEXTUALUE(k)函数,如果X[i]不等于0,则再由MCOLORING(k)调MCOLORING(k+1)函数,以此实现递归调用。
由用户输入颜色的数量和图G中所有结点的关系,例如:若i与j相互连结,则GRAPH[i][j]=1,否则GRAPH[i][j]=0。因为有m种颜色,所以每个结点都可以着m种颜色。
在MCOLORIG(k)中递归调用MCOLORING(k+1),并且输出每个结点着的颜色,用数组x[5]表示。在最初调用MCOLORING(0)时,应对图的邻接矩阵GRAPH[n][n]置初值并对数组x[n]置0值。
在进入函数NEXTVALUE(k)前,假设X(1),X(2),……X(k-1)都已分得了区域[1,m]中的整数且相邻的结点有不同的整数,此函数的目的是在区域
[0,m]中给X(k)确定一个值:如果还剩下一些颜色,它们与结点k邻接的结点分配的颜色不同,那么就将其中最高标值的颜色分配给结点k;如果没剩下可用的颜色,则置X(k)为0。
在主函数中给出m,N的取值以及GRAPH(1:n,1:n)的的布尔值,并且调用MXOLORING(0)。
我是初学者,还没入门,所以编写的程序不很规范,请高手们原谅,日后一定改正。
#13
但是我觉得我这样做的话,在输入G[i][j]的元素时很麻烦,而且很容易出错,请各位大虾教教我~!帮我改改程序~!
谢谢~!
谢谢~!
#14
學習,收藏!
#15
mark
#16
四色定理,听说过,但打死我也做不出来
#1
要枚举所有可能,
好好看看递规
好好看看递规
#2
我还是弄不懂问题出在哪里?能直接帮我改下吗?谢谢了~!
#3
程序上传的不正规,还是书写就不好!看的累!
#4
有时间看看吧..
#5
偶也是菜鸟
初学C语言 看不懂你的程序```` 惭愧`惭愧``
初学C语言 看不懂你的程序```` 惭愧`惭愧``
#6
有时间看看
#7
说说你程序的思想好么?看了好久,不明白
#8
#include <iostream>
#include <stdlib.h>
using namespace std;
int m,n,i,j,a=0;
int x[100]={0},G[100][100]={0};
int NEXTVALUE(int k)
{
int h;
for(h=0;h<m+1;h++)
{
x[k]=(x[k]+1)%(m+1);
for(j=0;j<n;j++)
{
if(G[k][j]&&(x[k]==x[j]))
break;
}
if(j==n)
break;
}
if(j==n) return(x[k]);
if(h==m+1) return(0);
}
void MCOLORING(int k)
{
while(k<n)
{
x[k]=NEXTVALUE(k);
if(x[k]==0)
{
x[k]=m+1;
break;
}
if(k==(n-1))
{a++;
for(j=0;j<n;j++)
printf("%d",x[j]);
printf("\n");
}
else
{
MCOLORING(k+1);
}}
}
int main(int argc, char *argv[])
{
printf("m=");
scanf("%d",&m);
printf("n=");
scanf("%d",&n);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{printf("G[%d][%d]=",i,j);
scanf("%d",&G[i][j]);
}
MCOLORING(0);
printf("total=%d",a);
system("PAUSE");
return 0;
}
#include <stdlib.h>
using namespace std;
int m,n,i,j,a=0;
int x[100]={0},G[100][100]={0};
int NEXTVALUE(int k)
{
int h;
for(h=0;h<m+1;h++)
{
x[k]=(x[k]+1)%(m+1);
for(j=0;j<n;j++)
{
if(G[k][j]&&(x[k]==x[j]))
break;
}
if(j==n)
break;
}
if(j==n) return(x[k]);
if(h==m+1) return(0);
}
void MCOLORING(int k)
{
while(k<n)
{
x[k]=NEXTVALUE(k);
if(x[k]==0)
{
x[k]=m+1;
break;
}
if(k==(n-1))
{a++;
for(j=0;j<n;j++)
printf("%d",x[j]);
printf("\n");
}
else
{
MCOLORING(k+1);
}}
}
int main(int argc, char *argv[])
{
printf("m=");
scanf("%d",&m);
printf("n=");
scanf("%d",&n);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{printf("G[%d][%d]=",i,j);
scanf("%d",&G[i][j]);
}
MCOLORING(0);
printf("total=%d",a);
system("PAUSE");
return 0;
}
#9
for(h=0;h<m+1;h++)
{
x[k]=(x[k]+1)%(m+1);
for(j=0;j<n;j++)
{
if(G[k][j]&&(x[k]==x[j]))
break;
}
if(j==n)
break;
}
if(j==n) return(x[k]);
if(h==m+1) return(0);
其中if(G[k][j]&&(x[k]==x[j])) 的判断条件是不行的,你只要两个相邻的格子不同。。
你的这种判断过度!!
{
x[k]=(x[k]+1)%(m+1);
for(j=0;j<n;j++)
{
if(G[k][j]&&(x[k]==x[j]))
break;
}
if(j==n)
break;
}
if(j==n) return(x[k]);
if(h==m+1) return(0);
其中if(G[k][j]&&(x[k]==x[j])) 的判断条件是不行的,你只要两个相邻的格子不同。。
你的这种判断过度!!
#10
惭愧``
#11
谢谢wwxsoft(婉儿),但是你的程序不能运行,提示为:
"Parameter 'argv' is never used in function main
Parameter 'argc' is never used in function main"
"Parameter 'argv' is never used in function main
Parameter 'argc' is never used in function main"
#12
我程序的思想如下:
我用的是递归算法来解决,使用函数MCOLORING和NEXTVALUE。其中全局变量为使用颜色的种数m,结点的个数n,图形的布尔值GRAPH(1:n,1:n)和每个结点的赋值X[i]。
首先使用主函数调用MCOLORING(k)函数,由MCOLORING函数调用NEXTUALUE(k)函数,如果X[i]不等于0,则再由MCOLORING(k)调MCOLORING(k+1)函数,以此实现递归调用。
由用户输入颜色的数量和图G中所有结点的关系,例如:若i与j相互连结,则GRAPH[i][j]=1,否则GRAPH[i][j]=0。因为有m种颜色,所以每个结点都可以着m种颜色。
在MCOLORIG(k)中递归调用MCOLORING(k+1),并且输出每个结点着的颜色,用数组x[5]表示。在最初调用MCOLORING(0)时,应对图的邻接矩阵GRAPH[n][n]置初值并对数组x[n]置0值。
在进入函数NEXTVALUE(k)前,假设X(1),X(2),……X(k-1)都已分得了区域[1,m]中的整数且相邻的结点有不同的整数,此函数的目的是在区域
[0,m]中给X(k)确定一个值:如果还剩下一些颜色,它们与结点k邻接的结点分配的颜色不同,那么就将其中最高标值的颜色分配给结点k;如果没剩下可用的颜色,则置X(k)为0。
在主函数中给出m,N的取值以及GRAPH(1:n,1:n)的的布尔值,并且调用MXOLORING(0)。
我是初学者,还没入门,所以编写的程序不很规范,请高手们原谅,日后一定改正。
我用的是递归算法来解决,使用函数MCOLORING和NEXTVALUE。其中全局变量为使用颜色的种数m,结点的个数n,图形的布尔值GRAPH(1:n,1:n)和每个结点的赋值X[i]。
首先使用主函数调用MCOLORING(k)函数,由MCOLORING函数调用NEXTUALUE(k)函数,如果X[i]不等于0,则再由MCOLORING(k)调MCOLORING(k+1)函数,以此实现递归调用。
由用户输入颜色的数量和图G中所有结点的关系,例如:若i与j相互连结,则GRAPH[i][j]=1,否则GRAPH[i][j]=0。因为有m种颜色,所以每个结点都可以着m种颜色。
在MCOLORIG(k)中递归调用MCOLORING(k+1),并且输出每个结点着的颜色,用数组x[5]表示。在最初调用MCOLORING(0)时,应对图的邻接矩阵GRAPH[n][n]置初值并对数组x[n]置0值。
在进入函数NEXTVALUE(k)前,假设X(1),X(2),……X(k-1)都已分得了区域[1,m]中的整数且相邻的结点有不同的整数,此函数的目的是在区域
[0,m]中给X(k)确定一个值:如果还剩下一些颜色,它们与结点k邻接的结点分配的颜色不同,那么就将其中最高标值的颜色分配给结点k;如果没剩下可用的颜色,则置X(k)为0。
在主函数中给出m,N的取值以及GRAPH(1:n,1:n)的的布尔值,并且调用MXOLORING(0)。
我是初学者,还没入门,所以编写的程序不很规范,请高手们原谅,日后一定改正。
#13
但是我觉得我这样做的话,在输入G[i][j]的元素时很麻烦,而且很容易出错,请各位大虾教教我~!帮我改改程序~!
谢谢~!
谢谢~!
#14
學習,收藏!
#15
mark
#16
四色定理,听说过,但打死我也做不出来