一开始看范围特别小就写搜索了。。。结果自己随便出了个4*4就过不了了。。
其实就是状态压缩DP,求哈密顿回路要多少条,只是要注意判断两点是否可以划线就可以了。
#include#include #include typedef __int64 LL;int n,m,tot;int mz[25],bet[25][25][25],full;int zero[16],zeros,hzero[25],lowb[65536];LL d[16][65536],ans;int cant(int st,int en,int stat){ st=zero[st],en=zero[en]; if(st>en)std::swap(st,en); for(int i=1;i<=bet[st][en][0];i++){ int x=bet[st][en][i]; if(mz[x]==1)return 1; if(mz[x]==0&&((stat>>hzero[x])&1)==0)return 1; } return 0;}LL dp(int last,int stat){ if(d[last][stat]!=-1)return d[last][stat]; if(stat==(stat&-stat))return 1; LL nans=0; int nstat=stat,now,i; while(nstat){ now=(nstat&-nstat),i=lowb[now],nstat-=now;; if(i==last||cant(i,last,stat))continue; nans+=dp(i,stat&~(1<