zoukankan      html  css  js  c++  java
  • 【构造】【贪心】hdu6090 Rikka with Graph

    给你n个点,让你连m条边,使得任意两两点对之间的最短路的和最小(两点若不可达,最短路记作n)。

    初始时ans=n*n*(n-1)。

    先尽量连成菊花图,每连一次让答案减小2*((n-2)*(i-1)+(n-1)),i为当前菊花图中的点数。

    连完后剩下的边,每连一次让答案减小2。

    如果已经用了n*(n-1)/2条边,剩下的边没有意义。

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    typedef long long ll;
    ll ans,m;
    int T,n;
    int main(){
    	scanf("%d",&T);
    	for(;T;--T){
    		scanf("%d%lld",&n,&m);
    		ans=(ll)n*(ll)(n-1)*(ll)n;
    		if(m<(ll)n){
    			for(int i=1;i<=(int)m;++i){
    				ans-=(ll)(i-1)*(ll)(n-2)*2ll;
    				ans-=(ll)(n-1)*2ll;
    			}
    		}
    		else{
    			for(int i=1;i<n;++i){
    				ans-=(ll)(i-1)*(ll)(n-2)*2ll;
    				ans-=(ll)(n-1)*2ll;
    			}
    			ll lim=min((ll)n*(ll)(n-1)/2ll,m);
    			ans-=(lim-(ll)n+1ll)*2ll;
    		}
    		printf("%lld
    ",ans);
    	}
    	return 0;
    }
  • 相关阅读:
    Linux文件结构
    磁盘分区
    BASH简介
    磁盘的基本概念
    Linux文件操作
    创建文件系统
    文件系统挂载
    一些常用命令
    asp.net创建PPT
    asp.net创建、删除、移动文件夹 文件
  • 原文地址:https://www.cnblogs.com/autsky-jadek/p/7309743.html
Copyright © 2011-2022 走看看