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_ 我无能为力