记录编号 |
405532 |
评测结果 |
AAAAAEEEAA |
题目名称 |
中心台站建设 |
最终得分 |
70 |
用户昵称 |
皓芷 |
是否通过 |
未通过 |
代码语言 |
C++ |
运行时间 |
2.460 s |
提交时间 |
2017-05-16 21:34:31 |
内存使用 |
23.24 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[2000001];
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)
{
for(int i=1;i<ansf.size();i++)
anss[ansc].a.push_back(ansf[i]);
sort(anss[ansc].a.begin(),anss[ansc].a.end());
// set<ansa>::iterator iter;
// iter=aaaa.find(anss[ansc]);
// if(iter!=aaaa.end())
int it=aaaa.count(anss[ansc]);
if(!it)
aaaa.insert(anss[ansc]);
ansc++;//printf("ans:");
}
else if(cmp<ansl)
{
for(int i=0;i<ansc;i++)anss[i].a.clear();
ansl=cmp;
ansc=0;
for(int i=1;i<ansf.size();i++)
anss[ansc].a.push_back(ansf[i]);
sort(anss[ansc].a.begin(),anss[ansc].a.end());
aaaa.clear();
aaaa.insert(anss[ansc]);
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;
}