最后两个点错了。。。不知道为什么。。。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int n,biao[5010],hd[5010],cnt,vis[5010],dfn;
int a[5010],b[5010],dp[5010]={1},tot,chu=1000000000;
bool ji[2010][2010];
struct nod{
int xu,nxt;
}cun[10000000];
inline void add(int x,int y){
cun[++cnt].xu=y;
cun[cnt].nxt=hd[x];
hd[x]=cnt;
}
inline bool dfs(int xu){
int zh;
if(biao[xu]==1)zh=2;
else zh=1;
for(int i=hd[xu];i;i=cun[i].nxt){
if(biao[cun[i].xu]==biao[xu])return 0;
if(!biao[cun[i].xu]){
biao[cun[i].xu]=zh;
if(!dfs(cun[i].xu))return 0;
}
}
return 1;
}
inline int dfss(int xu,int zhi){
int he=0;vis[xu]=dfn;
if(biao[xu]==zhi)++he;
for(int i=hd[xu];i;i=cun[i].nxt)
if(vis[cun[i].xu]!=dfn)he+=dfss(cun[i].xu,zhi);
return he;
}
inline int jue(int shu){
return shu<0?-shu:shu;
}
inline int read(){
int date=0,W=1;char ch=0;
while(!isdigit(ch)){if(ch=='-')W=-1;ch=getchar();}
while(isdigit(ch)){date=date*10+ch-'0';ch=getchar();}
return date*W;
}
int main(){
n=read();
for(int i=1;i<=n;++i){
int zh;
while(zh=read())ji[i][zh]=1;
}
for(int i=1;i<=n;++i)
for(int j=1;j<i;++j)
if(!ji[i][j]||!ji[j][i])
add(i,j),add(j,i);
for(int i=1;i<=n;++i)
if(!biao[i]){
biao[i]=1;
int zh=dfs(i);
if(!zh){
printf("No solution");
return 0;
}
++dfn;a[++tot]=dfss(i,1);
++dfn;b[tot]=dfss(i,2);
}
for(int i=1;i<=tot;++i)
for(int j=n;j>=1;--j){
if(j-a[i]>=0)dp[j]=max(dp[j],dp[j-a[i]]);
if(j-b[i]>=0)dp[j]=max(dp[j],dp[j-b[i]]);
}
for(int i=1;i<=n;++i)
if(dp[i])chu=min(chu,jue(n-i-i));
printf("%d %d",(n-chu)/2,(n-chu)/2+chu);
return 0;
}