CCO2017 Vera and Trail Building 构造+图论

解决CCO2017竞赛中的一个问题,涉及图论和构造方法。题目要求构造点数和边数不超过5000的无向连通图,使得完美点对数量为K(K≤107)。策略是构建双联通分量并连接它们,避免产生完美点对。每条边最多经过一次,且存在路径从a到b再返回a的条件定义了完美点对。
摘要由CSDN通过智能技术生成

正解:构造+图论

解题报告:

找了半天才找到的传送门!

先简要表达下题意

一个图上,如果存在(a,b)满足a<b且存在从a到b再回到a的路径,每条道路被经过至多一次,我们称(a,b)为完美点对
试构造一个点数和边数不超过5000的无向连通图,其完美点对数量恰好为K

k<=107

昂这题也比较简单啊,,,就每次都尽量大地构边双联通分量

然后把他们连起来就好辣

显然连起来是不会构造完美点对的

然后关于边双联通分量,可以得到当有n个点的时候完美点对的数量为n(n-1)/2

然后就好辣?

over!

#include<bits/stdc++.h>
using namespace std;
#define ll int
#define il inline
#define rg register
#define mp make_pair
#define rp(i,x,y) for(rg ll i=x;i<=y;++i)

ll n,cntv,cnte;
vector< pair<ll,ll> >as;

il ll read()
{
    rg char ch=getchar();rg ll x=0;rg bool y=1;
    while(ch!='-' && (ch>'9' || ch<'0'))ch=getchar();
    if(ch=='-')ch=getchar(),y=0;
    while(ch<='9' && ch>='0')x=(x<<3)+(x<<1)+(ch^'0'),ch=getchar();
    return y?x:-x;
}
il ll gt(ll x){ll tmp=sqrt(x)+5;while(tmp*(tmp-1)>(x<<1))--tmp;return tmp;}

int main()
{
    n=read();
    while(n)
    {
        ll tmp=(1+sqrt(8*N+1))/2+ 1e-8;if(cntv)as.push_back(mp(1,cntv+1)),++cnte;
        rp(i,cntv+1,cntv+tmp-1)as.push_back(mp(i,i+1)),++cnte;as.push_back(mp(cntv+tmp,cntv+1)),++cnte;
        cntv+=tmp;n-=tmp*(tmp-1)/2;
    }
    printf("%d %d\n",cntv,cnte);
    rp(i,0,cnte-1)printf("%d %d\n",as[i].first,as[i].second);
    return 0;
}
loj的页面吼吼看鸭!而且数据都开放!太美好辣!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值