zoukankan      html  css  js  c++  java
  • 洛谷 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("
    ");
    54     }*/
    55     dfs(1);
    56     get(1);
    57     printf("%d
    ",ans);
    58     return 0;
    59 }
    30分贪心,dalao都90
     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
    ",ans);
    66     return 0;
    67 }
    dfs ac
  • 相关阅读:
    Python冒泡排序(4)
    Python冒泡排序(3)
    Python3默认递归最大深度是998
    Python利用递归函数和列表推导式实现快速排序
    天池比赛的文章--欢迎大家交流
    caffe学习笔记1
    网络压缩系列1:低秩逼近
    yolov1
    Windows下用Caffe跑自己的数据(遥感影像)
    基于灰度共生矩阵的纹理提取
  • 原文地址:https://www.cnblogs.com/chen74123/p/7500285.html
Copyright © 2011-2022 走看看