#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=20+10;
char ss[N][N];
typedef unsigned LL;
int mp[N][N];
int top,sta[N],clo[N];
int num,vis[N][N],ti,s1;
int dfs(int dep){
if(dep==top){
num--;
return 1;
}
int fg=++ti;
int u=sta[dep];
for(int i=0;i<dep;i++){
int v=sta[i];
if(mp[u][v]){
//printf("%d %d\n",u,v);
vis[dep][clo[i]]=fg;
}
}
for(int i=1;i<num;i++){
if(vis[dep][i]!=fg){
clo[dep]=i;
if(dfs(dep+1))return 1;
}
}
return 0;
}
int dp[1<<20];
int main(){
#ifdef DouBi
freopen("in.cpp","r",stdin);
#endif // DouBi
int T;scanf("%d",&T);
while(T--){
int n;scanf("%d",&n);
for(int i=0;i<n;i++)for(int j=0;j<n;j++)scanf("%d",&mp[i][j]);
int ed=1<<n;
memset(vis,0,sizeof(vis));
ti=0;
dp[0]=0;
for(int i=1;i<ed;i++){
top=0;
num=0;
for(int j=0;j<n;j++){
int bt=1<<j;
if(i&bt){
sta[top++]=j;
num=max(num,dp[i^bt]);
}
}
num++;
int fg=1;
for(int j=0;j<top&&fg;j++){
for(int k=0;k<j;k++){
if(mp[sta[j]][sta[k]]==0){
fg=0;break;
}
}
}
if(!fg)dfs(0);
dp[i]=num;
}
}
return 0;
}
图染色
最新推荐文章于 2023-02-03 13:08:12 发布