bzoj 1399 坑

xiaoxiao2021-02-27  133


TLE

//bzoj win #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define ll long long #define M(a) memset(a,-1,sizeof a) #define fo(i,j,k) for(i=j;i<=k;i++) using namespace std; const int mxn=18; int s,n,m,mx,cnt,dep,tmp; int a[mxn][mxn],num[mxn],head[mxn]; int dp[mxn][1<<16][6]; struct edge {int to,next;} f[mxn*mxn]; inline void add(int u,int v) { f[++cnt].to=v,f[cnt].next=head[u],head[u]=cnt; } inline int dfs(int root,int now,int k) { if(!now) return 0; if(dp[root][now][k]>=0) return dp[root][now][k]; if(now==(1<<root-1)) return dp[root][now][k]=1; if((1<<k-1)<num[now]) return dp[root][now][k]=0; if(k==1) return dp[root][now][k]=0; int i,j,tmp=0; for(int s=(now-1)&now;s;s=(s-1)&now) { if((1<<root-1)&s) continue; for(int i=head[root];i;i=f[i].next) { int v=f[i].to; if((1<<v-1)&s) tmp+=dfs(root,now^s,k-1)*dfs(v,s,k-1); } } return dp[root][now][k]=tmp; } int main() { int i,j,k,p; fo(i,1,(1<<16)-1) { int x=i; while(x) { if(x&1) num[i]++; x>>=1; } } while(scanf("%d%d",&n,&m)!=EOF) { memset(head,0,sizeof head); M(dp),cnt=dep=1; while(cnt<n) cnt<<=1,dep++; cnt=0; fo(i,1,n) fo(j,1,n) { scanf("%d",&a[i][j]); if(a[i][j]) add(i,j); } printf("%d\n",dfs(m,(1<<n)-1,dep)); } return 0; }
转载请注明原文地址: https://www.6miu.com/read-15578.html

最新回复(0)