记录编号 405549 评测结果 AAAAATTTAA
题目名称 中心台站建设 最终得分 70
用户昵称 Gravatar皓芷 是否通过 未通过
代码语言 C++ 运行时间 3.032 s
提交时间 2017-05-16 21:51:37 内存使用 0.36 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<vector>
#include<set>
#include<algorithm>
#define mysister
#define maxn 101
using namespace std;
int n,a[maxn][maxn],cmp=-1,ansl=0x7fffffff,ans[maxn],ansc=0,vis[maxn];
vector<int>b[maxn];
vector<int>ansf;
vector<int>anse;
//vector<int>anss[maxn];
struct ansa
{
	vector<int>a;
	bool operator < (ansa b)const
	{
		int ss=min(a.size(),b.a.size());
		for(int i=0;i<ss;i++)
		{
		  if(a[i]==b.a[i])continue;
		  return a[i]<b.a[i];
		}
		return a.size()<b.a.size();
	}
	bool operator == (ansa b)const
	{
		int ss=min(a.size(),b.a.size());
		for(int i=0;i<ss;i++)
		{
		  if(a[i]==b.a[i])continue;
		  return a[i]==b.a[i];
		}
		return a.size()==b.a.size();
	}
}anss;
set<ansa>aaaa;
void dfs(int k)
{
//	printf("%d ",k);
	cmp++;
/*	if(cmp>ansl)
	{
	  printf("qaq\n");
	  cmp--;
	  return;
	}*/
	ansf.push_back(k);
	vis[k]=1;
	int tt=1,ans2[maxn]={0};
	for(int i=1;i<=n;i++)
	  if(a[k][i]&&(!ans[i]))
	  {
	  	ans2[i]=1;
	  	ans[i]=1;
	  }
	for(int i=1;i<=n;i++)if(!ans[i])tt=0;
	if(cmp+1<=ansl)for(int i=1;i<=n;i++)if(!ans[i])
	{
	  for(int j=0;j<b[i].size();j++)
		if(!vis[b[i][j]])
		  dfs(b[i][j]);
	}
	if(tt)
	{
	  if(cmp==ansl)
	  {
	  	anss.a.clear();
		for(int i=1;i<ansf.size();i++)
		  anss.a.push_back(ansf[i]);
		sort(anss.a.begin(),anss.a.end());
//		set<ansa>::iterator iter;
//		iter=aaaa.find(anss[ansc]);
//		if(iter!=aaaa.end())
		int it=aaaa.count(anss);
		if(!it)
		  aaaa.insert(anss);
//		ansc++;//printf("ans:");
	  }
	  else if(cmp<ansl)
	  {
		anss.a.clear();
		ansl=cmp;
		ansc=0;
		for(int i=1;i<ansf.size();i++)
		  anss.a.push_back(ansf[i]);
		sort(anss.a.begin(),anss.a.end());
		aaaa.clear();
		aaaa.insert(anss);
//		ansc++;//printf("ans:");
	  }
	}
	ansf.pop_back();
	for(int i=1;i<=n;i++)
	  if(ans2[i])ans[i]=0;
	cmp--;
//	printf("fuuu\n");
	vis[k]=0;
}
void print()
{
	printf("%d\n",ansl);int anscc=0;
	for(set<ansa>::iterator it=aaaa.begin();it!=aaaa.end();it++)
	  anscc++;
	printf("%d\n",anscc);
	for(set<ansa>::iterator it=aaaa.begin();it!=aaaa.end();it++)
	{
	  for(int i=0;i<(*it).a.size();i++)
	    cout<<(*it).a[i]<<" ";
	  cout<<"\n";
	}
}
int main()
{
	freopen("zpj.in","r",stdin);
	freopen("zpj.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
	  b[i].push_back(i);
	  for(int j=1;j<=n;j++)
	  {
	  	scanf("%d",&a[i][j]);
	    if(a[i][j])b[j].push_back(i);
	  }
	}
	for(int i=1;i<=n;i++)
	  a[i][i]=1;
	dfs(0);
	print();
	return 0;
}