省选模拟测试23 T1直径
创始人
2024-05-29 17:25:36
0

题目大意

给你一个数kkk,请你构造一棵节点数量小于等于5000的直径数量为kkk的树。

我们定义这棵树的直径为,所有满足1≤i

1≤k≤5×106,0≤wi≤1051\leq k\leq 5\times 10^6,0\leq w_i\leq 10^51≤k≤5×106,0≤wi​≤105,wiw_iwi​表示第iii条边的边权。


题解

构造一个菊花图,根节点有三个儿子,每个儿子所在的子树大小分别为a,b,ca,b,ca,b,c且都是一条由权值为0的边组成的链,那么直径为ab+bc+caab+bc+caab+bc+ca。

在这里插入图片描述
我们需要令k=ab+ac+bc=(a+c)(b+c)−c2k=ab+ac+bc=(a+c)(b+c)-c^2k=ab+ac+bc=(a+c)(b+c)−c2。

我们可以枚举ccc,将k+c2k+c^2k+c2分解质因数,直到找到合适的(a,b,c)(a,b,c)(a,b,c)即可。

经过计算可以证明有很高的概率存在这样合适的解,实际上对于所有的kkk都如此。

当然,这种方法不一定完全正确,有可能需要四个或更多儿子才能构造出。更好的方法,请看我的另一篇博客。

code

#include
using namespace std;
int n,tot=0,vt=1,fl=0;
struct node{int x,y,z;
}w[10005];
void dd(int v){for(int i=1;i<=v-1;i++){w[++tot]=(node){vt,vt+1};++vt;}
}
int main()
{scanf("%d",&n);for(int a,b,c=1;c<=5000;c++){int v=n+c*c;for(int i=c;i*i<=v;i++){if(v%i>0) continue;a=i-c;b=v/i-c;if(a>=0&&b>=0&&a+b+c+1<=5000){if(a){w[++tot]=(node){1,++vt,1};dd(a);}if(b){w[++tot]=(node){1,++vt,1};dd(b);}if(c){w[++tot]=(node){1,++vt,1};dd(c);}fl=1;break;}}if(fl) break;}printf("%d\n",vt);for(int i=1;i<=tot;i++){printf("%d %d %d\n",w[i].x,w[i].y,w[i].z);}return 0;
}

一些思考

如果wiw_iwi​不能为000,怎么办呢?我们把根节点的每个儿子分别设置对应多个儿子,使得这些儿子没有儿子且到其父亲边权为1即可。

在这里插入图片描述

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...