hdu 多校联赛 Rikka with Graph

本文探讨了RikkawithGraph问题中的数学挑战,即如何通过构造图来最小化图的距离权重之和。提供了针对不同边界条件的算法实现,并通过样例输入输出展示了算法的有效性。

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

Rikka with Graph

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 0    Accepted Submission(s): 0


Problem Description
As we know, Rikka is poor at math. Yuta is worrying about this situation, so he gives Rikka some math tasks to practice. There is one of them:

For an undirected graph G with n nodes and m edges, we can define the distance between (i,j) (\text{dist}(i,j)) as the length of the shortest path between i and j. The length of a path is equal to the number of the edges on it. Specially, if there are no path between i and j, we make \text{dist}(i,j) equal to n.

Then, we can define the weight of the graph G (w_G) as \sum_{i=1}^n \sum_{j=1}^n \text{dist}(i,j).

Now, Yuta has n nodes, and he wants to choose no more than m pairs of nodes (i,j)(i \neq j) and then link edges between each pair. In this way, he can get an undirected graph G with n nodes and no more than m edges.

Yuta wants to know the minimal value of w_G.

It is too difficult for Rikka. Can you help her?  

In the sample, Yuta can choose (1,2),(1,4),(2,4),(2,3),(3,4).
 

Input
The first line contains a number t(1 \leq t \leq 10), the number of the testcases. 

For each testcase, the first line contains two numbers n,m(1 \leq n \leq 10^6,1 \leq m \leq 10^{12}).
 

Output
For each testcase, print a single line with a single number -- the answer.
 

Sample Input
1 4 5
 

Sample Output
14
 

这道题做的时候掉到坑里去了 忘了环状和链状的路径都比放射状的长度长 加上后面一个变量没用long long类型 就这么傻傻的错了十几遍 最近智商下降有点严重(┬_┬)、、

ac代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        long long n,m;
        long long ans=0;
        scanf("%lld%lld",&n,&m);
        if(m>=n)
        {
            if(n*(n-1)/2<=m)
                {ans=n*(n-1);
                }
            else if(n*(n-1)/2>m)
                {ans=n*(n-1)+(n*(n-1)/2-m)*2;
                }
        }
        else if(m==n-1)
        {
            ans=(n-2)*(n-1)*2+2*(n-1);
        }
        else if(m<n-1)
        {
            ans+=(m-1)*m*2+2*m;
            long long g=n-(m+1);
            ans+=g*(m+1)*n*2;
            ans+=g*(g-1)*n;
        }
        cout<<ans<<endl;
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值