Rikka with Graph

来源:互联网 发布:js给class加样式 编辑:程序博客网 时间:2024/05/29 15:37

原题链接:点击查看原题

题意:

给你n个点,你可以在这n个点之间任意连<=m条线,使∑ni=1∑nj=1dist(i,j).的值最小。

其中dist(i,j)表示如过i和j之间有通路,则dist(i,j)的值为i和j之间经过的边数。如a--->b---c

(前提是没有a--->c,如过有的话,就取 1 而不是 2 ,因为要使值最小)那么dist(a,c)等于2
因为经过了两条边,如过a和b之间没有通路,那么dist(a,b)就等于n。



解题思路:

假设这些点相互都相连,即n*(n-1)/2=m,则答案为:n*(n-1),

假设这些点是联通的,即:m>=n-1,我们可以根据上种情况接着思考,如果每有一个不相互连通,则就要加2,

即:n*(n-1)+(n*(n-1)/2-m)*2.

假设有一部分相连,即:m<n-1,

q表示没相连的点,p为相连的点。则:p=m+1,q=n-m-1。

对于没有相连的:q*(q-1)*n

对于相连的:(p-1)*(p-1)*2;//由(1+(m-1)*2)*m+m化简得到

对于没相连的点与相连的:q*p*n;

把上边的相加就是最终答案。


原代码:


#include <iostream>using namespace std;int main(){   int t;   cin>>t;   while(t--)   {       long long n,m;       cin>>n>>m;       if(n*(n-1)/2<=m){            cout<<n*(n-1)<<endl;            continue;       }       if(m>=n-1)        cout<<n*(n-1)+(n*(n-1)/2-m)*2<<endl;       else       {           long long p=m+1;           long long q=n-m-1;           long long ans=q*p*n*2+q*(q-1)*n+2*(p-1)*(p-1);           cout<<ans<<endl;       }   }   return 0;}


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 我的世界延迟怎么办 黄金棒打不开怎么办 枪火游侠黑屏怎么办 老虎直播封了怎么办 网卡及驱动异常怎么办 电脑刺激战场卡怎么办 grub 文件兼容性错误怎么办 电脑程序不兼容怎么办 运行程序不兼容怎么办 usb驱动删了怎么办 电脑卡死 点不开怎么办 电脑开机找不到驱动程序怎么办 显卡关了黑屏怎么办 xp全部程序打不开怎么办 七彩凤电脑打不开怎么办 鹦鹉鱼不敢吃食怎么办 甘油三酯1.87怎么办 手机移动数据网打不开怎么办 苹果手机浏览器打不开没网怎么办 玩多人游戏很紧张怎么办 dnf容易掉线怎么办 qq名字改不了怎么办 手被打火机烧伤怎么办 无效的菜单句柄怎么办 网课被发现刷课怎么办 华硕笔记本玩游戏卡怎么办 手机玩游戏卡顿怎么办? 360n4s玩游戏卡怎么办 手机玩游戏卡死怎么办 游戏占用cpu过高怎么办 h1z1 cpu占用高怎么办 电视盒子网速慢怎么办 gta5解压完然后怎么办 火山遭举报了怎么办 火山被恶意举报怎么办 gta5无网络链接怎么办 pdf格式没有解压密码怎么办 电脑感染蠕虫病毒怎么办 手机积分被盗兑怎么办 自动雨伞卡住了怎么办 全自动伞收不了怎么办