HDU 6090 Rikka with Graph (贪心+构造, 2017 Multi-Univ Training Contest 5)

本文介绍了一种构造图论问题的解决方案,通过选取中心点并优先连接新点以实现最短路径距离总和最小化。文章详细阐述了贪心算法的具体步骤,并提供了完整的代码示例。

Problem

图上两点间距离被定义为 disti,j 为两点间最短路距离(任意直接相连两点距离为 1 ),若两点不连通,则记 disti,j 为该图中点数 n 。

要求构造一个 n 点 m 条边的图 G ,使得 ni=1nj=1disti,j 最小。

Limit

1n106

1m1012

Idea

贪心地构造。

  1. 任意选择一点作为图中心点
  2. 当仍可以添边时,优先加入新的点并将其与中心点相连(如此使得任意新点到中心点距离为 1 ,任意两个连通点的距离为 2 )。
  3. 若边不足,则剩余未连通点到任意点的距离都为 n 。
  4. 若所有点都已经与中心点相连,且边仍有剩余,则任意连接两不直接相连的点,使得其距离由 2 变成 1 。
  5. 结束构造,统计结果。

Code

#include<bits/stdc++.h>
using namespace std;
int T, n;
long long m;
int main()
{
    scanf("%d", &T);
    while(T-- && scanf("%d %lld", &n, &m)) 
    {
        if(m > (long long)n*(n-1) / 2)  // n 点的图两两相连的边数最多只需要 n*(n-1)/2 ,多余的将干扰结果处理
            m = (long long)n*(n-1) / 2;
        long long lnk = min((long long)n-1, m); // 与中心点相连的点数
        long long ext = n - lnk - 1;            // 孤立点数量
        long long ans = lnk * (lnk-1) + lnk + ext * (ext - 1) / 2 * n + ext * (lnk+1) * n;
        if(m > lnk) ans -= (m-lnk);
        ans *= 2;
        printf("%lld\n", ans);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值