代码如下,只有一个剪枝+一个排序优化,然而跑得飞快
求各位大神帮忙想想怎么卡掉,或者能证明复杂度也行
#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;
int n,a[507][507],t[507],vis[507],st[507],buc[507],h[507];
struct node{
int x,y;
};
node v[507];
void dfs(int u){
if(u>n){
printf("YES\n");
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
printf("%d",a[i][t[j]]);
}
printf("\n");
}
exit(0);
}
for(int i=1;i<=n;i++){
bool flag=false;
int p=v[i].x;
if(!vis[p]){
for(int j=1;j<=n;j++){
if(buc[j]!=h[j] && buc[j] && !a[j][p]){
flag=true;
break;
}
}
if(flag) continue;
for(int j=1;j<=n;j++){
if(a[j][p]) buc[j]++;
}
t[u]=p;
vis[p]=1;
dfs(u+1);
vis[p]=0;
for(int j=1;j<=n;j++){
if(a[j][p]) buc[j]--;
}
}
}
}
bool cmp(node x,node y){
return x.y<y.y;
}
int main(){
// freopen("meow.in","r",stdin);
scanf("%d",&n);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
scanf("%1d",&a[i][j]);
h[i]+=a[i][j];
v[j].x=j;
v[j].y+=a[i][j];
}
}
sort(v+1,v+1+n,cmp);
dfs(1);
printf("NO");
return 0;
}