题意:给定n个点,m条边,让你安排点和边构成一个无向图。dis(i,j),表示i到j最小的边数,如果无法到达,dis(i,j)为n,问每个点到其他所有的点的dis之和。
思路:简单的贪心策略问题,有两种情况
1.
当m>n-1(连通)的时候2*m个dis(i,j)为1,其余为2
2.
当m<n-1(不联通)的时候可分为两部分
(1)m+1个点是联通的和1一样
(2)n-(m+1)个点独立存在,到其他点全是n
ac代码:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
long long sum;
long long a,b;
cin>>a>>b;
if(b>=a*a-a)
{
cout<<a*a-a<<endl;
continue;
}
if(b>=a-1)
sum=(a*a-a-(long long)2*b)*(long long)2+(long long)2*b;
else
sum=(long long)2*b+b*(b-1)*(long long)2+(a*a-a-(long long)2*b-b*(b-1))*a;
cout<<sum<<endl;
}
return 0;
}