Description
要求构造一个不超过100个点的无向图使得该图有 k 个三元环
Input
一个正整数
Output
首先输出一整数
n
表示要构造的图的点数,之后输入一个
Sample Input
1
Sample Output
3
011
101
110
Solution
首先尽可能用较少的点构造多一点三元环,所以先构造一个
m
个点完全图,
Code
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<ctime>
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
#define maxn 111
int a[maxn],b[maxn],m[maxn][maxn];
int main()
{
for(int i=0;i<=100;i++)a[i]=i*(i-1)*(i-2)/6,b[i]=i*(i-1)/2;
int k;
while(~scanf("%d",&k))
{
memset(m,0,sizeof(m));
int n=0,add=0;
int pos=upper_bound(a,a+101,k)-a-1;
k-=a[pos];
n=pos;
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
m[i][j]=m[j][i]=1;
while(k)
{
int pos=upper_bound(b,b+101,k)-b-1;
k-=b[pos];
add++;
for(int i=1;i<=pos;i++)
m[n+add][i]=m[i][n+add]=1;
}
n+=add;
printf("%d\n",n);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
printf("%d",m[i][j]);
printf("\n");
}
}
return 0;
}