Rikka with Graph
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 112 Accepted Submission(s): 81
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条边,使得选出的图 ∑ni=1∑nj=1dist(i,j) . 的值最小。
思路:
显然类似这样的菊花图去取边是最优的方案。
那么考虑:
①最初如果M=0的时候,答案是n^3-n^2
②当M=1的时候,对答案减少的贡献是n-1.
③当M>1&&M<=n-1的时候,每条边对答案减少的贡献是(i-1)*(n-2)+(n-1);
④当M>n-1的时候,每条边对答案减少的贡献是2或者是0.
⑤答案最小是n^2-n;
那么我们暴力搞一下就行了。
Ac代码:
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
#define ll __int64
int a[1500000];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
ll n,m;
scanf("%I64d%I64d",&n,&m);
ll Ans=n*n*n-n*n;
for(ll i=1;i<=n-1&&i<=m;i++)
{
if(i==1)Ans-=2*(n-1);
else Ans-=2ll*((i-1)*(n-2)+(n-1));
}
m=max(0ll,m-(n-1));
Ans-=2*m;
Ans=max(Ans,n*n-n);
printf("%I64d\n",Ans);
}
}