HDU 6090 Rikka with Graph 思维 公式

  题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6090

  题目描述: 有n个点, 你可以连m条边, 使得ni=1nj=1dist(i,j).最小, 不连通的两个点dis为n

  解题思路: 推公式.....其他的不难推, 边小于n-1最难推.........已知m == n-1结果是2 * (n-1)*(n-1), 可以看做去掉一条边就加上若干个(n-1)和(n-2), 然后得出大长串儿......

  代码: 

#include <cstdio>
#include <iostream>
using namespace std;

typedef long long ll;
ll n, m;

int main() {
    int T;
    scanf( "%d", &T );
    while( T-- ) {
        cin >> n >> m;
        if( m < n - 1 ) {
            cout << 2*(n-1)*(n-1)+2*(m)*(n-1-m)*(n-2)+2*(n-1-m)*(n-1)+(n-1-m)*(n-m-2)*(n-2) << endl;
            continue;
        }
        else if( m == n - 1 ) {
            cout << 2*(n-1)*(n-1) << endl;
            continue;
        }
        else if( m > n - 1 && m < n * (n - 1) / 2 ) {
            cout << 2*(n-1)*(n-1)-2*(m-n+1) << endl;
            continue;
        }
        else cout << n*(n-1) << endl;
    }
    return 0;
}
View Code

  思考: 扣半天才抠出来.....之前自己有个地方少考虑了.....结果.......

posted on 2017-08-08 19:44  FriskyPuppy  阅读(201)  评论(0编辑  收藏  举报

导航