救救孩子吧

P1285 队员分组

Dah_ @ 2019-08-08 10:31:51

鬼知道哪里有问题

#include <iostream>
#include <cstdio>
#include <memory.h>
#include <stdlib.h>
#include <queue>
#define r(x) x=read()
#define MAXX 250
#define MAX(a,b) (a>b?a:b)
#define MIN(a,b) (a<b?a:b)
using namespace std;
typedef long long ll;
int read()
{
  char ch=0;int w=0,ff=1;
  while(ch<'0'||ch>'9'){if(ch=='-')ff=-1;ch=getchar();}
  while(ch>='0'&&ch<='9'){w=w*10+ch-'0';ch=getchar();}
  return ff*w;
}
int flag2[MAXX],ans,ans2,pre[MAXX][MAXX],h[MAXX],cnt,map2[MAXX][MAXX],flag[MAXX],w[MAXX][2],dp[MAXX][2],tot,temp,n;
int lis[MAXX][2][MAXX];
struct edge{int to,nex;}e[MAXX<<8];
void add(int u,int to)
{
  e[++cnt]=(edge){to,h[u]};
  h[u]=cnt;
}
void dfs(int now,int fa)
{
  lis[tot][flag[now]][++w[tot][flag[now]]]=now;
  for(int i=h[now];i;i=e[i].nex)
  {
    if(e[i].to==fa) continue;
    if(flag[e[i].to]==-1){flag[e[i].to]=flag[now]^1,dfs(e[i].to,now);}
    if(flag[e[i].to]==flag[now]) printf("No solution"),exit(0);
    //if(flag[e[i].to]==-1) dfs(e[i].to,now);
  }
}
void prt()
{
  int ans2=n-ans;
  printf("%d",ans);
  for(int i=tot;i>=1;--i)
  {
    int t=ans;
    ans-=w[i][pre[i][t]];
    for(int j=1;j<=w[i][pre[i][t]];++j)
      flag2[lis[i][pre[i][t]][j]]=1;
  }
  for(int i=1;i<=n;++i)
    if(flag2[i]) printf(" %d",i);
  printf("\n%d",ans2);
  for(int i=1;i<=n;++i)
    if(!flag2[i]) printf(" %d",i);
  printf("\n");
}
int main()
{
  memset(flag,-1,sizeof(flag));
  flag[0]=0;
  r(n);
  for(int i=1;i<=n;++i)
  {
    temp=-1;
    while(temp!=0) {r(temp);if(temp!=0) map2[i][temp]=1;}
  }
  for(int i=1;i<=n;++i)
    for(int j=i+1;j<=n;++j)
      if(map2[i][j]==0||map2[j][i]==0) add(i,j),add(j,i);
  for(int i=1;i<=n;++i)
    if(flag[i]==-1)
    {
      tot++;
      flag[i]=0;
      dfs(i,0);
    }
  dp[0][0]=1;
  for(int i=1;i<=tot;++i)
  {
    for(int j=0;j<=(n+1)/2;++j)
    {
      int check=j-w[i][0];
      if(check>=0&&dp[i-1][check]==1)
      {
        dp[i][j]=1;
        pre[i][j]=0;
      }
      check=j-w[i][1];
      if(check>=0&&dp[i-1][check]==1)
      {
        dp[i][j]=1;
        pre[i][j]=1;
      }
    }
  }
  for(int i=(n+1)/2;i>=1;--i)
    if(dp[tot][i]){ans=i;break;}
  if(ans==0) printf("No solution"),exit(0);
  prt();
  return 0;
}

by lnzab @ 2020-12-19 20:19:21

@Dah_ 我无能为力


|