P5687 [CSP-S2019 江西] 网格图(贪心)
P5687 [CSP-S2019 江西] 网格图(贪心)
题意简介
在 \(n*m\) 的矩阵内构造最小生成树,每一行(列)上连一小段的代价相同
思路
考虑类似于 \(Kruskal\) 的贪心,将边权从小到大排序后依次取每一条边,若在完整一列上连边后出现环,则可删去 \([已连接的行数-1]\) 条边
Code
#include<iostream>
#include<algorithm>
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using namespace std;
const int N=3e5+5;
int n,m,a[N],b[N],pos1=2,pos2=2,cnt1=1,cnt2=1;
long long ans=0;
int main()
{
IOS;
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=m;i++)
cin>>b[i];
sort(a+1,a+n+1);
sort(b+1,b+m+1);
ans+=(long long)a[1]*(m-1);
ans+=(long long)b[1]*(n-1);//保证行或列上至少连一次
while(pos1<=n&&pos2<=m)
{
if(a[pos1]<=b[pos2]) ans+=(long long)a[pos1++]*(m-cnt2),cnt1++;
else ans+=(long long)b[pos2++]*(n-cnt1),cnt2++;
}
cout<<ans<<'\n';
return 0;
}
完结撒花~
浙公网安备 33010602011771号