2017 Multi-University Training Contest

来源:互联网 发布:mac上前端开发软件 编辑:程序博客网 时间:2024/06/05 17:03

http://acm.hdu.edu.cn/showproblem.php?pid=6090


题意:

  给出 n 个点和 m 条边,你可以任意组合成一个图,然后对一个图来说它的值就是每个点到其他点的距离,对于相联通的两个点来说这两个点之间的距离就是他们之间最短的边数,而不联通的两个点之间的距离就等于 n,要你求这个图的最小值

思路:

  考虑贪心地一条一条边添加进去。
  1.当mn1时,我们需要最小化距离为 n 的点对数,所以肯定是连出一个大小为 m+1 的联通块,剩下的点都是孤立点。在这个联通块中,为了最小化内部的距离和,肯定是连成一个菊花的形状,即一个点和剩下所有点直接相邻。
  2.当 m>n1 时,肯定先用最开始 n1条边连成一个菊花,这时任意两点之间距离的最大值是 2。因此剩下的每一条边唯一的作用就是将一对点的距离缩减为 1。

代码:

#include<bits/stdc++.h>using namespace std;#define ll long longll n,m;int main(){    ll t;    scanf("%lld",&t);    while(t--){        scanf("%lld %lld",&n,&m);        if(m <= n - 1){            ll ans = 2 * m * m + (n * (n - 1) - m * (m + 1)) * n;            printf("%lld\n",ans);        }else{            m = min(m,n * (n - 1) / 2);            ll ans = n * (n - 1) * 2 - m * 2;            printf("%lld\n",ans);        }    }    return 0;}
原创粉丝点击