题意: 解法: 容易想到d[i]<0的点直接连. 对于d[i]>=0的点肯定要道路服用,使得正权边数量和权值和最小. 为了使得负权边贡献最大,容易想到这样连边(假设图中的点都满足d[i]>=0): 其中每个点向前面的点连的边,都是负权边,且i->j的边权=-dist[j][i]. 最后就是考虑每加入一个点,这个点对答案会新增的贡献即可. code: #include<bits/stdc++.h> #define int long long using namespace std; const int maxm=1e5+5; int a[maxm]; int n; void solve(){ cin>>n; for(int i=1;i<=n;i++){ cin>>a[i]; } sort(a+1,a+1+n); int ans=0; int num=0; int sum=0; int last=0; for(int i=1;i<=n;i++){ if(a[i]<0)ans+=a[i]; else{//a[i]>0 int now=a[i]-last; ans+=now; // sum+=now*num; ans-=sum; num++; last=a[i]; } } cout<<ans<<endl; } signed main(){ ios::sync_with_stdio(0);cin.tie(0); int T;cin>>T;while(T--) solve(); return 0; }