2017 Multi-University Training Contest 5 solutions 1006 Rikka with Graph

本文探讨如何通过构造特定图结构来最小化图中所有点对之间的距离和。介绍了两种情况:当边的数量小于等于节点数量减一时,构建一个核心节点连接所有其他节点的图;当边的数量超过节点数量减一时,首先构建一个基本图结构,再通过增加额外边来减少点对间的距离。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

考虑贪心地一条一条边添加进去。

当 m≤n−1mn1 时,我们需要最小化距离为 nn 的点对数,所以肯定是连出一个大小为 m+1m+1 的联通块,剩下的点都是孤立点。在这个联通块中,为了最小化内部的距离和,肯定是连成一个菊花的形状,即一个点和剩下所有点直接相邻。

当 m>n−1m>n1 时,肯定先用最开始 n−1n1 条边连成一个菊花,这时任意两点之间距离的最大值是 22。因此剩下的每一条边唯一的作用就是将一对点的距离缩减为 11

这样我们就能知道了最终图的形状了,稍加计算就能得到答案。要注意 mm 有可能大于 n(n−1)22n(n1)


#include <cstdio>
#include <iostream>
using namespace std;
long long int ans;
long long int maxm;
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        long long n,m;
        scanf("%lld%lld",&n,&m);
        ans=n*(n-1);
        maxm=ans/2;
        if(m>=maxm) printf("%lld\n",ans);
        else if(m>=n-1)
            printf("%lld\n",ans+(maxm-m)*2);
        else
        printf("%lld\n",n*(n-m-1)*(n+m)+2*m*m);
    }
    return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值