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) ( 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 dist(i,j) equal to n .
Then, we can define the weight of the graph G ( wG ) as ∑ni=1∑nj=1dist(i,j) .
Now, Yuta has n nodes, and he wants to choose no more than m pairs of nodes (i,j)(i≠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 wG .
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) .
For an undirected graph G with n nodes and m edges, we can define the distance between (i,j) ( 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 dist(i,j) equal to n .
Then, we can define the weight of the graph G ( wG ) as ∑ni=1∑nj=1dist(i,j) .
Now, Yuta has n nodes, and he wants to choose no more than m pairs of nodes (i,j)(i≠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 wG .
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≤t≤10)
, the number of the testcases.
For each testcase, the first line contains two numbers n,m(1≤n≤106,1≤m≤1012) .
For each testcase, the first line contains two numbers n,m(1≤n≤106,1≤m≤1012) .
Output
For each testcase, print a single line with a single number -- the answer.
Sample Input
1 4 5
Sample Output
14
题意:
给定n个点,m条边,dis(i,j)为两点之间的最小边数,若不连通为n。求所有点对之间的dis(i,j)和最小为多少。
思路:
找规律,发现如果不大于n-1条边时连成星型图最短,大于n-1条边时,任意不直达的边相连都能使和减小2。如果任意两点存在边,则再增加边和也不会减小。
//
// main.cpp
// 1006
//
// Created by zc on 2017/8/8.
// Copyright © 2017年 zc. All rights reserved.
//
#include <iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
int main(int argc, const char * argv[]) {
int T;
scanf("%d",&T);
ll n,m;
while(T--)
{
scanf("%lld%lld",&n,&m);
ll ans=n*n*(n-1);
if(m<n)
{
ans=m*m*2+(n-m-2)*(n-m-1)*n+(n-m-1)*(m+1)*n*2;
}
else if(m<n*(n-1)/2)
{
ans=(n-1)*(n-1)*2-2*(m-n+1);
}
else
{
ans=n*(n-1);
}
printf("%lld\n",ans);
}
}