Codeforces Round #144 (Div. 2) C. Cycles

7 篇文章 0 订阅

题目链接:http://codeforces.com/contest/233/problem/C

      题意是给一个数字k,让我们构造出一个无向图,这个无向图里恰好有k个三元环。输出顶点数然后以邻接矩阵的方式输出这幅图,顶点数必须小于100.

每日一题里的题目,终于有一道简单能写的了。一副n个顶点的完全图G,其三元环的个数是C(3,n)个,然后如果现在再有一个点,然后给这个点向图G连两条边,那么三元环数多1,再加一条边多,答案增加2,再加,答案增加3。如果超过k时,再添加一个新点,然后重复上述步骤,这样去迭代就行。

#include<cmath>
#include<algorithm>
#include<cstring>
#include<string>
#include<set>
#include<map>
#include<time.h>
#include<cstdio>
#include<vector>
#include<stack>
#include<queue>
#include<iostream>
using namespace std;
#define  LONG long long
const int   INF=0x3f3f3f3f;
const LONG  MOD=1e9+61;
const double PI=acos(-1.0);
#define clrI(x) memset(x,-1,sizeof(x))
#define clr0(x) memset(x,0,sizeof x)
#define clr1(x) memset(x,INF,sizeof x)
#define clr2(x) memset(x,-INF,sizeof x)
#define EPS 1e-10
int  C[120];
int A[120] ;
int p = 0;
int Map[120][120];
void dfs(int k )
{
    if(k == 0)return ;
    for(int i = 1 ; i <= 100 ;++ i)
    {
        if(k < i)
        {
            A[++p] = i ;
            break ;
        }
        k -= i ;
    }
    dfs(k) ;
}
int main()
{
    for(int i = 3 ; i <= 100 ;++ i)
        C[i] = i * ( i - 1) * (i-2)/6;
    int k ;
    clr0(Map);
    cin>>k ;
    int res = 0;
    for(int i = 3 ; i<=100 ;++ i)
        if(k<C[i])
        {
            k -= C[i-1];
            res = i-1;
            break;
        }
    dfs(k) ;
    int n = res + p;
    for(int i = 1; i <= res ; ++ i)
        for(int j = i + 1; j<=res ; ++ j)Map[i][j] = 1,Map[j][i] = 1;
    for(int i =  res + 1; i <=  res + p  ; ++ i)
        for(int j = 1 ; j <= A[i-res ] ; ++ j)Map[i ][j] = 1,Map[j][i] =1 ;
    cout<<n<<endl;
    for(int i =1; i<=n ; ++ i)
    {
        for(int j = 1; j<=n ;++ j)printf("%d",Map[i][j]);cout<<endl;
    }
}



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值