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;
}

完结撒花~

posted @ 2025-08-05 09:36  FallingGardenia  阅读(32)  评论(0)    收藏  举报