题目传送门
思路:
根据题意,每个点至少连两条边, 2 2 2 点时无解。那么就是说 N N N 个点 N N N 条边连完之后的权值都是一样,我们就考虑形成最大环的连法,对于多出来的边,肯定是连权值最小的边,题目给了说,两点之间可以连任意多的边。
代码如下:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e6+10;
int T,n,k;
struct fridge{
int id,val;
}a[N];
int cmp(fridge a,fridge b){
return a.val<b.val;
}
signed main(){
cin>>T;
while(T--){
cin>>n>>k;
int mi=0,ans=0;
for(int i=1;i<=n;i++){
cin>>a[i].val;
a[i].id=i;
}
sort(a+1,a+1+n,cmp);
if(k<n||n==2){
cout<<-1<<endl;
continue;
}
for(int i=1;i<=n;i++){
ans+=a[i].val*2;
}
ans+=(k-n)*(a[1].val+a[2].val);
cout<<ans<<endl;
for(int i=1;i<n;i++){
cout<<i<<" "<<i+1<<endl;
}
cout<<n<<" "<<1<<endl;
for(int i=1;i<=k-n;i++){
cout<<a[1].id<<" "<<a[2].id<<endl;
}
}
return 0;
}
完结撒花~

652

被折叠的 条评论
为什么被折叠?



