求助
查看原帖
求助
236970
yewanxingkong楼主2020/12/2 10:17

最后两个点错了。。。不知道为什么。。。

#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;
}
2020/12/2 10:17
加载中...