#include <stdio.h> #include <string.h> #include <algorithm> #define NUM 110 using namespace std; int n; ///图的顶点数 int m; ///可用的颜色数量 int c[NUM][NUM]; ///图的邻接矩阵 int x[NUM]; ///当前的解向量 int sum; ///总方案数目 int match; bool Same(int t) { int i; for(i=1; i<=n; i++) if(c[t][i]==1&&x[i]==x[t]) return false; return true; } ///形参t是回溯的深度,从1开始 void BackTrack(int t) { int i; if(t>n) { sum++; for(i=1; i<=n; i++) printf("%d ",x[i]); printf("\n"); } else { ///搜索当前扩展节点的m个孩子 for(i=1; i<=m; i++) { x[t] = i; if(Same(t)) BackTrack(t+1); x[t] = 0; } } } int main() { m=4; int Cases; scanf("%d",&Cases); while(Cases--) { sum=0; for(int i=0;i<NUM;i++) for(int j=0;j<NUM;j++) c[i][j] = 0; scanf("%d%d",&n,&match); for(int i=1; i<=match; i++) { int father,brother; scanf("%d%d",&father,&brother); c[father][brother]=c[brother][father]=1; } BackTrack(1); printf("%d\n",sum); } return 0; }
时间: 2024-12-06 20:14:41