最小连通代价
作者:
Air1222
,
2024-06-15 16:51:17
,
所有人可见
,
阅读 3
#include <iostream>
using namespace std;
typedef long long LL;
int main()
{
int t;
cin>>t;
while(t--)
{
LL n,a,b;
cin>>n>>a>>b;
LL cnt1=0,cnt2=0;
for(int i=0;i<n;i++)
{
int x;
cin>>x;
if(x%2==0) cnt1++;
else cnt2++;
}
if(cnt1==n||cnt2==n)
{
if(a<0) cout<<a*(n-1)*n/2<<endl;
else cout<<a*(n-1)<<endl;
}
else
{
if(a<0&&b<0)
cout<<cnt1*cnt2*b+a*(cnt1*(cnt1-1)/2+cnt2*(cnt2-1)/2)<<endl;
if(a>=0&&b<0)
cout<<cnt1*cnt2*b<<endl;
if(a<0&&b>=0)
cout<<a*(cnt1*(cnt1-1)/2+cnt2*(cnt2-1)/2)+b<<endl;
if(a>=0&&b>=0)
{
if(a<b)
cout<<a*(cnt1+cnt2-2)+b<<endl;
else
cout<<b*(n-1)<<endl;//注意连通图最少为n-1条边
}
}
}
}