2 条题解

  • 0
    @ 2023-4-25 20:08:38

    错的也敢发上来? 代码:

    //好像没什么可注释的...
    #include<cstdio>
    const int maxn=10005;
    const int maxm=maxn<<1;
    const int inf=0x3f3f3f3f;
    int f[maxn][2];
    int n,m,tot,x,y,root;
    int c[maxn],h[maxn],to[maxm],nxt[maxm];
    int min(int x,int y){
    	return x<y?x:y;
    }
    void read(int&x){
    	x=0;
    	bool f=0;
    	char ch=getchar();
    	while(ch<'0'||ch>'9'){
    		if(ch=='-')f=1;
    		ch=getchar();
    	}
    	while(ch<='9'&&ch>='0'){
    		x=(x<<1)+(x<<3)+(ch&15);
    		ch=getchar();
    	}
    	if(f)x=-x;
    	return;
    }
    void add(int x,int y){
    	to[++tot]=y;
    	nxt[tot]=h[x];
    	h[x]=tot;
    	to[++tot]=x;
    	nxt[tot]=h[y];
    	h[y]=tot;
    	return;
    }
    void dfs(int x,int fa){
    	for(int i=h[x];i;i=nxt[i]){
    		int e=to[i];
    		if(e==fa)continue;
    		dfs(e,x);
    		f[x][0]+=min(f[e][0]-1,f[e][1]);
    		f[x][1]+=min(f[e][0],f[e][1]-1);
    	}
    	return;
    }
    int main(){
    	read(n);read(m);
    	for(int i=1;i<=m;++i){
    		read(c[i]);
    		f[i][c[i]]=1;
    		f[i][!c[i]]=inf;
    	}
    	for(int i=1;i<n;++i){
    		read(x);read(y);
    		add(x,y);
    	}
    	for(int i=m+1;i<=n;++i)
    		f[i][0]=f[i][1]=1;
    	dfs(n,-1);	//本来之前我也不知道可以随便选根,据说 n 当根可以过,我就用 n 做根了www
    	printf("%d",min(f[n][0],f[n][1]));
    	return 0;
    }
    
    
    • 0
      @ 2023-3-19 20:55:27
      #define MAXM 10010
      #define INF 20000
      using namespace std;
      struct node
      {
          int to, next;
      } e[MAXM << 1];
      int head[MAXM], tot;
      int f[MAXM][3], m, n, c[MAXM];
      void add(int u, int v)
      {
          tot++, e[tot].to = v, e[tot].next = head[u], head[u] = tot;
      }
      void init()
      {
          int i, u, v;
          scanf("%d%d", &m, &n);
          for (i = 1; i <= n; i++)
              scanf("%d", &c[i]);
          for (i = 1; i < m; i++)
          {
              scanf("%d%d", &u, &v);
              add(u, v), add(v, u);
          }
          for (i = 1; i <= m; i++)
              f[i][0] = f[i][1] = 1;
      }
      void dfs(int u, int fa)
      {
          int i, v;
          for (i = head[u]; i; i = e[i].next)
          {
              v = e[i].to;
              if (v == fa)
                  continue;
              dfs(v, u);
              if (v <= n)
                  f[v][!c[v]] = INF, f[v][2] = 1;
              f[u][0] += min(f[v][2], min(f[v][0] - 1, f[v][1]));
              f[u][1] += min(f[v][2], min(f[v][0], f[v][1] - 1));
              f[u][2] += min(f[v][2], min(f[v][0], f[v][1]));
          }
      }
      int main()
      {
          init();
          dfs(n + 1, -1);
          printf("%d\n", min(f[n + 1][2], min(f[n + 1][0], f[n + 1][1])));
          return 0;
      }
      
      • 1

      信息

      ID
      477
      时间
      1000ms
      内存
      512MiB
      难度
      5
      标签
      递交数
      30
      已通过
      15
      上传者