P3101解题记录

该文是关于USACO竞赛中的一道题目SkiCourseRatingG的解题记录,主要涉及带权并查集的数据结构。代码使用C++编写,解决了一个基于网格的地形问题,通过比较边的权值来合并集合,并计算满足特定条件的集合数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

P3101晚自习写题记录

P3101 [USACO14JAN]Ski Course Rating G - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

比较好的一道带权并查集题目

#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
const int N = 510000;
int fa[N],h[510][510],s[510][510],id[505][510],tot[N],ts[N];//s[ ]表示起点,h[ ]表示海拔
struct node
{
    ll w,x,y;
}a[N];

ll T,ans,ds,ce,m,n;//ds表示点的数量
int find(int x)
{
    if(fa[x] != x)return fa[x] = find(fa[x]);
}
bool cmp(node a,node b)
{
    return a.w < b.w;
}
int main()
{
    cin>>m>>n>>T;
    for(int i = 1;i <= m;i++)
       for(int j = 1;j <= n;j++)
        cin>>h[i][j];

    for(int i = 1;i <= m;i++)
            for(int j = 1;j <= n;j++)
                cin>>s[i][j];

        for(int i = 1;i <= m;i++)
            for(int j = 1;j <= n;j++)
                id[i][j] = ++ds,ts[ds] = s[i][j];//ts表示当前集合起点数量,每个点初始化为一个集合

        for(int i = 1;i <= m;i++)
            for(int j = 1;j <= n;j++)
            {
                //ce表示边的数量
                //以下操作表示建边
                if(i != m)ce++,a[ce].x = id[i][j],a[ce].y = id[i+1][j],a[ce].w = abs(h[i][j] - h[i+1][j]);  
                if(j != n)ce++,a[ce].x = id[i][j],a[ce].y = id[i][j+1],a[ce].w = abs(h[i][j] - h[i][j+1]);
           }    

           for(int i = 1;i <= ds;i++)//所有边初始化
           fa[i] = i,tot[i] = 1;//tot[]表示集合中的总点数
           sort(a+1,a+ce+1,cmp);

           for(int i = 1;i <= ce;i++)//枚举所有边
           {
            int fx = find(a[i].x);
           int fy = find(a[i].y);
           if(fx != fy)
           {
            fa[fx] = fy,ts[fy] += ts[fx],tot[fy] += tot[fx],ts[fx] = tot[fx] = 0;//最后的操作表示清空
            if(tot[fy] >= T)ans += ts[fy] *a[i].w,ts[fy] = 0;
           }
           }
    cout<<ans<<endl;
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值