ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

FJWC2019 直径

2019-02-26 21:42:27  阅读:254  来源: 互联网

标签:int FJWC2019 6666 构造 数为 printf 直径


题目描述

你需要构造一棵至少有两个顶点的树,树上的每条边有一个非负整数边权。树上两点 i,j 的距离dis(i,j) 定义为树上连接i 和j 这两点的简单路径上的边权和。

我们定义这棵树的直径为,所有满足 1≤i<jn 的  (i,j) 中, dis(i,j) 最大的。如果有多个这样的  (i,j),那么均为直径。

你需要构造一个恰有 k 个直径的树。可以证明在给定的限制下一定有解。

你构造的树需要保证 2≤n≤5000,且每条边的边权满足 50≤w≤10^5。

对于所有数据,满足 1≤k≤5000000。

Solution

构造题真是有意思…[然而本蒟蒻不会x]

构造一棵挂了三个菊花的图…

大概长这样?

我图画的还是好丑啊

我们要干一件事情 我们使得每个菊花图内的每一个分叉都能和另一个菊花的任意一个分叉形成一条直径

这时候我们设左边那棵菊花的节点数为a,下面那棵的节点数为b,右边那棵的节点数为c

那么这个图的直径的数量就是ab+bc+ac

然后我们感性理解打表一下发现,a,b,c最大为1500的时候,就可以做出K的所有情况。

我好菜啊都不会构造

Code

  1. #include <bits/stdc++.h>  
  2. using namespace std;  
  3. int a,b,c,K;  
  4. int main()  
  5. {  
  6.     freopen("diameter.in","r",stdin);  
  7.     freopen("diameter.out","w",stdout);  
  8.     scanf("%d",&K);  
  9.     for (a=1;a<=1500;a++)  
  10.       for (b=a;b<=1500;b++)  
  11.         for (c=b;c<=1500;c++)  
  12.           if (a*b*1ll+b*c*1ll+a*c*1ll==K)  
  13.             goto sinian;  
  14.     a=b=c=-2;  
  15.     sinian:  
  16.     if (a==-2||K<=2000)  
  17.     {  
  18.         printf("%d\n",K+1);  
  19.         printf("1 2 2\n");  
  20.         for (int i=2;i<=K;i++)  
  21.           printf("%d %d 0\n",i,i+1);  
  22.     }  
  23.     else  
  24.     {  
  25.         printf("%d\n",a+b+c+1);  
  26.         printf("1 2 6666\n");  
  27.         printf("1 3 6666\n");  
  28.         printf("1 4 6666\n");  
  29.         --a;--b;--c;  
  30.         for (int i=5;i<a+5;i++)  
  31.           printf("2 %d 0\n",i);  
  32.         for (int i=a+5;i<a+b+5;i++)  
  33.           printf("3 %d 0\n",i);  
  34.         for (int i=a+b+5;i<a+b+c+5;i++)  
  35.           printf("4 %d 0\n",i);  
  36.     }  
  37.     return 0;  
  38. }  

标签:int,FJWC2019,6666,构造,数为,printf,直径
来源: https://www.cnblogs.com/si--nian/p/10440348.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有