本文共 1061 字,大约阅读时间需要 3 分钟。
图着色,第一行输入三个数,n,m,k,n为顶点数,m为颜色数,k为边数,n为行数,i到j有边,n小于等于20,输出各点颜色号,一行输出,空格分割,没有就输出NO
#include#include using namespace std;int m,n,k;int map[105][105];int color[105];int ans;//对于每个点,枚举它可能被染的颜色。如果与它相连的点颜色和它相同,那么就换下一个颜色;如果哪个颜色也不能选,那就回到上一个点换颜色(回溯),当确定完最后一个点的颜色后,这就是一个可行解,将答案增加1。void a(int p){//遍历图上任意点,因为没有确定编号n以后的点的颜色。所以到n-1就相对于把点全遍历一遍 if(p == n+1) { ans++; return; } else { for(int i=1;i<=m;i++) { int boo = false; for(int j=1;j<=p;j++) { if(map[p][j] == 1 && color[j] == i) { boo = true; break; } } if(boo == true) continue; color[p] = i; a(p+1); color[p] = 0; } }}int main(){ scanf("%d%d%d",&n,&k,&m); for(int i=1;i<=k;i++) { int d1,d2; scanf("%d%d",&d1,&d2); map[d1][d2] = 1; map[d2][d1] = 1; } a(1); if(ans != 0) printf("%d",ans); else printf("NO"); return 0;}
转载地址:http://crucb.baihongyu.com/