您的位置:首页 > 其它

HDU 6090 Rikka with Graph (图论规律题)

2017-10-08 16:59 211 查看

Rikka with Graph

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)

Total Submission(s): 1009    Accepted Submission(s): 583


[align=left]Problem Description[/align]
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).
 

[align=left]Input[/align]
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).
 

[align=left]Output[/align]
For each testcase, print a single line with a single number -- the answer.
 

[align=left]Sample Input[/align]

1
4 5

 

[align=left]Sample Output[/align]

14

 

[align=left]Source[/align]
2017 Multi-University Training Contest - Team 5 
【分析】:

听说这叫菊花图。。。

题意:存在一个无向图,n个点,你可以任意的加上m条边,权值为1。然后其余的不存在的边权值为n。

问所有的i点到j点的最短路之和。

推规律,设完全图的边数目为 all = n*(n-1)/2 ,分三种情况:

1、m>all ,直接输出all*2(完全图)

2、m<n-1,无法构成一棵树,这种有点点麻烦。

任意选一点,开始绕着方边,能放多少就放多少。

然后,

长度为1的路有m条

长度为2的路有m个点形成完全图个

剩下的边都是长度为n的

累加起来即可。

3、其他,这种情况下,怎么安排边?

就绕着一个点方边,这个点放完了,换个点接着绕。

这样建图就会形成这样的局势:

有m个权值为1的边,剩下的任意i->j的最短路为2。

【代码】:#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
ll T,m,n;
int main()
{
cin>>T;
while(T--)
{
cin>>n>>m;
ll all=n*(n-1)/2;
if(m>=all)
printf("%lld\n",all*2);
else if(m<n-1)//有孤点
printf("%lld\n",2*m+2*m*(m-1)+2*n*( (m+1)*(n-m-1)+(n-m-1)*(n-m-2)/2) );
else //联通的无向图(包括树)
printf("%lld\n",2*m+4*(all-m));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: