记录编号 250236 评测结果 AAAAAAAAAA
题目名称 信号无错传输 最终得分 100
用户昵称 GravatarRapiz 是否通过 通过
代码语言 C++ 运行时间 0.006 s
提交时间 2016-04-14 18:57:42 内存使用 0.37 MiB
显示代码纯文本
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>

using namespace std;
const int MAXN=100+1;
int n,minn,ans,e[MAXN][MAXN];
int del[MAXN];
char buf[10000],tmp[10000];
void dfs(int u,int now){//考虑u,已经去掉now 
	if(n-now<minn) return;
	else if(u>n){
		//更新答案
		if(n-now>minn) ans=0,minn=n-now,buf[0]=0;
		ans++;
		tmp[0]=0;
		for(int i=1;i<=n;i++) if(!del[i]) sprintf(tmp+strlen(tmp),"%d ",i);
		sprintf(tmp+strlen(tmp),"\n");
		strcat(buf,tmp);
	}
	else if(del[u]) dfs(u+1,now);
	else {
		//u在方案中
		int d=0;
		for(int v=1;v<=n;v++) if(e[u][v]) d+=(del[v]==0?1:0),del[v]++;
		dfs(u+1,now+d);
		for(int v=1;v<=n;v++) if(e[u][v]) del[v]--;
		//u不在方案中
		del[u]++;
		dfs(u+1,now+1);
		del[u]--;
	}
}
int main(){
	freopen("dlj.in","r",stdin);
	freopen("dlj.out","w",stdout);
	cin>>n;
	for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) cin>>e[i][j];
	//for(int i=1;i<=n;i++) if(!pre[i]) cutv(i,-1);
	dfs(1,0);
	cout<<minn<<endl<<ans<<endl<<buf;
}