洛谷 P1041 传染病控制
Posted Alex丶Baker
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷 P1041 传染病控制相关的知识,希望对你有一定的参考价值。
P1041 传染病控制
dfs枚举去掉的子树,更新当前感染节点
emmmm
这个题,每次去掉最大的子树的做法是错误的
比如
hhh,按照那个贪心的思路肯定是先去掉左边的子树,这样答案会是4
但是先去掉右边的子树的话答案就是3
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define maxn 1000000+15 4 int n,m,x,y,fa[maxn],mmp[10000],sum[maxn],ans=1; 5 vector<int>vec[1000]; 6 7 void get(int x) 8 { 9 ans+=vec[x].size(); 10 for(int i=0;i<vec[x].size();i++) get(vec[x][i]); 11 } 12 13 void dfs(int x) 14 { 15 if(vec[x].size()==0) return ; 16 int maxx=-1,maxo,tot=0; 17 memset(mmp,0,sizeof(mmp)); 18 for(int i=0;i<vec[x].size();i++) 19 if(sum[vec[x][i]]>maxx) maxo=vec[x][i],maxx=sum[vec[x][i]]; 20 for(int i=0;i<vec[x].size();i++) 21 if(vec[x][i]!=maxo) mmp[++tot]=vec[x][i]; 22 while(vec[x].size()) vec[x].pop_back(); 23 for(int i=1;i<=tot;i++) 24 vec[x].push_back(mmp[i]); 25 for(int i=0;i<vec[x].size();i++) dfs(vec[x][i]); 26 } 27 28 int main() 29 { 30 scanf("%d%d",&n,&m); 31 for(int i=1;i<=m;i++) 32 { 33 scanf("%d%d",&x,&y); 34 vec[x].push_back(y); 35 fa[y]=x; 36 sum[y]++; 37 } 38 for(int i=n;i>=1;i--) 39 { 40 if(vec[i].size()==0) continue ; 41 for(int j=0;j<vec[i].size();j++) 42 sum[i]+=sum[vec[i][j]]; 43 } 44 /*for(int i=1;i<=n;i++) 45 { 46 if(vec[i].size()==0) continue; 47 else{ 48 for(int j=0;j<vec[i].size();j++) 49 { 50 printf("%d ",vec[i][j]); 51 } 52 } 53 printf("\\n"); 54 }*/ 55 dfs(1); 56 get(1); 57 printf("%d\\n",ans); 58 return 0; 59 }
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define maxn 1000+15 5 #define inf 0x3f3f3f3f 6 using namespace std; 7 8 int n,m,ans=inf; 9 int f[maxn][maxn],sum[maxn],q[maxn]; 10 bool vis[maxn]; 11 12 void gets(int s) 13 { 14 int j=0,k; 15 sum[s]=1,vis[s]=1; 16 for(int i=1;i<=f[s][0];i++) 17 { 18 k=f[s][i]; 19 if(!vis[k]) 20 { 21 f[s][++j]=k; 22 gets(k); 23 sum[s]+=sum[k]; 24 } 25 } 26 f[s][0]=j; 27 } 28 29 void dfs(int l,int r,int s) 30 { 31 if(s>=ans) return; 32 int i,j,k; 33 for(k=r,i=l;i<=k;i++) 34 if(!vis[q[i]]) 35 for(j=1;j<=f[q[i]][0];j++) 36 q[++r]=f[q[i]][j]; 37 if(r-k-1<=0) 38 { 39 ans=min(ans,s); 40 return; 41 } 42 s+=r-k-1; 43 for(i=k+1;i<=r;i++) 44 { 45 vis[q[i]]=1; 46 dfs(k+1,r,s); 47 vis[q[i]]=0; 48 } 49 } 50 51 int main() 52 { 53 scanf("%d%d",&n,&m); 54 for(int i=1;i<=m;i++) 55 { 56 int j,k; 57 scanf("%d%d",&j,&k); 58 f[j][++f[j][0]]=k; 59 f[k][++f[k][0]]=j; 60 } 61 gets(1); 62 q[0]=1,q[1]=1; 63 memset(vis,0,sizeof(vis)); 64 dfs(1,1,1); 65 printf("%d\\n",ans); 66 return 0; 67 }
以上是关于洛谷 P1041 传染病控制的主要内容,如果未能解决你的问题,请参考以下文章