HDU 6090 Rikka with Graph(构造)

来源:互联网 发布:巨人网络收购playtika 编辑:程序博客网 时间:2024/05/16 10:57

Description

定义一张图的权为任意两点之间最短路之和,如果两个点不互达则距离为n ,问一个n个点m条边的图权的最小值

Input

第一行一整数T表示用例组数,每组用例输入两个整数n,m分别表示点数和边数(1T10,1n106,1m1012)

Output

对于每组用例,输出一个答案

Sample Input

1

4 5

Sample Output

14

Solution

m<n1时,为了让距离为n的点对尽可能少,用m条边连一个m+1个点的连通块,其它点是孤立点,为使该连通块内部距离和最短,必然连成一个菊花图,此时菊花图除中心外任意两点距离为2,中心到任一点距离为1

n1mn(n1)2时,首先用n1条边把n个点连成菊花图,剩下的边每加入一条最多让两点间距离从2变成1

m>n(n1)2,答案和m=n(n1)2的一样,此时多的边没有意义

Code

#include<cstdio>using namespace std;typedef long long ll;ll n,m;int main(){    int T;    scanf("%d",&T);    while(T--)    {        scanf("%I64d%I64d",&n,&m);        ll ans;        if(m<n-1)        {            ll x=n-(m+1);            ans=2ll*m*m+2ll*x*(m+1)*n+x*(x-1)*n;        }        else if(m<=n*(n-1)/2)        {            ans=2ll*(n-1)*(n-1)-2ll*(m-(n-1));        }        else ans=n*(n-1);        printf("%I64d\n",ans);    }    return 0;}
原创粉丝点击