hdu6090

来源:互联网 发布:mac 播放器 mplayerx 编辑:程序博客网 时间:2024/06/06 04:09

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


题意:给你n个点,然后有m条边连接着,每条边权值为1,如果两个点没有连通,这两点之间的距离为n,这m条边是随意连的,你要算出每个点到其他点加起来的总和。


思路:可以分析一下,如果有n*(n-1)/2条边连着,那么每两个点都连着,这样总和不就是n*(n-1),接下来到n-1条边时,减少一条边就会使和加2,当m小于n-1时,分成两个部分,一个是已经连通的,还有一部分是未连通的点,这样未连通的点之间的距离为n,连通到未连通之间的也为n,加起来就是总和了。


代码:

#include<iostream>#include<algorithm>#include<cstring>#include<cstdio>using namespace std;long long int list[1111111];int main(){    int T;    long long int n,m;    list[1]=0;    for(long long int i=2;i<1111111;i++)        list[i]=2*(i-1)*(i-1);    cin>>T;    while(T--)    {        long long int res=0;        cin>>n>>m;        if(n==1)        {            cout<<0<<endl;            continue;        }       else  if(m>=n-1)        {            if(m>n*(n-1)/2)                m=n*(n-1)/2;            res=list[n]-2*(m-n+1);        }        else        {            res=list[m+1]+n*2*(m+1)*(n-m-1)+n*(n-m-1)*(n-m-2);        }        cout<<res<<endl;    }    return 0;}