[bzoj3979] [WF2012]infiltration
Posted czllgzmzl
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[bzoj3979] [WF2012]infiltration相关的知识,希望对你有一定的参考价值。
膜了半天ccz大爷的题解...随机调整好神啊。。
大概就是把点随机一下,按随机后的顺序控制,顺便删掉无用点。
做完一次后,把一个已被控制的点丢回去,然后继续随机顺序做下去。。。
为啥我要尝试的次数比ccz大爷多那么多啊QAQ
实测一次丢多个点回去反而不好...
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<cstdlib> 5 #include<algorithm> 6 using namespace std; 7 const int maxn=79; 8 int st[maxn],b[maxn]; 9 int mp[maxn][maxn],cd[maxn],deg[maxn]; 10 int i,j,k,n,m,ans; 11 char s[maxn]; 12 13 14 inline void run(){ 15 int i,top=n,now,numb=0;register int j; 16 memset(deg,0,(n+1)<<2); 17 for(i=1;i<=n;i++) 18 for(st[i]=i,j=1;j<=cd[i];j++)deg[mp[i][j]]++; 19 for(int t=20;t;t--){ 20 for(i=2;i<=top;i++)swap(st[i],st[rand()%(i-1)+1]); 21 for(i=1;i<=top;i++){ 22 now=st[i]; 23 for(j=1;j<=cd[now];j++)if(deg[mp[now][j]]<=1)break; 24 if(j>cd[now]){ 25 for(j=1;j<=cd[now];j++)deg[mp[now][j]]--; 26 b[++numb]=now; 27 st[i]=st[top],i--,top--; 28 } 29 } 30 for(i=1;i<=n;i++)if(!deg[i])return; 31 if(top<ans)ans=top; 32 if(numb){ 33 now=rand()%numb+1; 34 for(j=1;j<=cd[b[now]];j++)deg[mp[b[now]][j]]++; 35 st[++top]=b[now]; 36 b[now]=b[numb],numb--; 37 } 38 } 39 } 40 int main(){ 41 int T=0;srand(1844677); 42 while(scanf("%d",&n)!=EOF){ 43 T++; 44 for(i=1;i<=n;i++){ 45 scanf("%s",s+1);s[i]=\'1\'; 46 cd[i]=0; 47 for(j=1;j<=n;j++)if(s[j]==\'1\')mp[i][++cd[i]]=j; 48 } 49 ans=n; 50 for(i=100;i;i--)run(); 51 printf("Case %d: %d\\n",T,ans); 52 } 53 }
以上是关于[bzoj3979] [WF2012]infiltration的主要内容,如果未能解决你的问题,请参考以下文章
bzoj 3978: [WF2012]Fibonacci Words
BZOJ 4078: [Wf2014]Metal Processing Plant
BZOJ3963[WF2011]MachineWorks cdq分治+斜率优化
bzoj3963[WF2011]MachineWorks cdq分治+斜率优化dp