ACM-ICPC 2018 徐州赛区网络预赛 J - Maze Designer

本文介绍了一种在N*M网格上构建迷宫的方法,通过构建最大生成树来确保任意两点间仅有一条路径,并利用LCA算法计算两点间最短距离。涉及关键步骤包括初始化并查集,构建边集合,排序并合并节点,以及使用深度优先搜索进行LCA计算。

题目链接:https://nanti.jisuanke.com/t/31462

题意:
在一个N*M的空地上,建墙造一个迷宫,使得迷宫的耗费最小,且迷宫中的任意两点之间只有一条路,题目保证每组数据的迷宫唯一。
输入迷宫中两个点的坐标,输出两点间的距离

思路:任意两点间只有一条路,显然是一棵树。在地图上建最大生成树,就可以使得墙的耗费最小。两点间距离就是在树上跑LCA

#include <cstdio>
#include <queue>
#include <vector>
#include <cstring>
#include <algorithm>

using namespace std;

const int maxn = (int)3e5 + 5;
int N,M,Q;
#define getpos(i,j) (i-1)*M + j

struct Edge
{
    int u,v,w;
    Edge(int _u=0,int _v=0,int _w=0)
    {
        u = _u;
        v = _v;
        w = _w;
    }
    bool operator<(const Edge a) const
    {
        return w > a.w;
    }
};

vector<Edge> e;
vector<int> G[maxn];
int f[maxn];
int Find(int x)
{
    return x == f[x] ? x : f[x] = Find(f[x]);
}

int deep[maxn],in[maxn],out[maxn],cnt,anc[maxn][21],dis;
void dfs(int u,int fa)
{
    in[u] = ++cnt;
    deep[u] = deep[fa] + 1;
    anc[u][0] = fa;
    for (int i = 1; i <= 20; ++i)
    {
        anc[u][i] = anc[anc[u][i-1]][i-1];
        if(!anc[u][i])
            break;
    }
    for(auto v:G[u])
    {
        if(v!=fa)
            dfs(v,u);
    }
    out[u] = cnt;
}

int lca(int a,int b)
{
    if(deep[a]>deep[b])
        swap(a,b);
    if(in[a] <= in[b] && out[b] <= out[a])
        return a;
    for(int i=20;~i;--i)
        if(deep[a] < deep[b] && deep[a] <= deep[anc[b][i]])
            b = anc[b][i];
    for(int i=20;~i;--i)
        if(anc[a][i]!=anc[b][i])
            a = anc[a][i], b = anc[b][i];
    return anc[a][0];
}

void init()
{
    cnt = 0;
    for (int i = 1; i < maxn; ++i)
    {
        f[i] = i;
    }
    deep[0] = 0;

}

int main()
{
    init();
    int u, v, w;
    char dir[2];
    scanf("%d%d",&N,&M);
    for(int i = 1;i <= N; ++i)
    {
        for (int j = 1; j <= M ; ++j)
        {
            u = getpos(i,j);
            for (int k = 0; k < 2; ++k)
            {
                scanf("%s%d",dir,&w);
                if (dir[0] == 'D')
                    v = getpos(i+1,j);
                else if (dir[0] == 'R')
                    v = getpos(i,j+1);
                else
                    continue;
                e.emplace_back(Edge(u,v,w));
            }
        }
    }
    sort(e.begin(),e.end());
    int x, y;
    for (auto i:e)
    {
        x = Find(i.u);
        y = Find(i.v);
        if(x!=y)
        {
            G[i.v].emplace_back(i.u);
            G[i.u].emplace_back(i.v);
            f[x] = y;
        }
    }
    dfs(getpos(1,1),0);
    scanf("%d",&Q);
    int x1, y1, x2, y2, L;
    while(Q--)
    {
        scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
        u = getpos(x1,y1), v = getpos(x2,y2);
        L = lca(u,v);
        printf("%d\n",deep[u] + deep[v] - 2*deep[L]);
    }
    return 0;
}
MATLAB代码实现了一个基于多种智能优化算法优化RBF神经网络的回归预测模型,其核心是通过智能优化算法自动寻找最优的RBF扩展参数(spread),以提升预测精度。 1.主要功能 多算法优化RBF网络:使用多种智能优化算法优化RBF神经网络的核心参数spread。 回归预测:对输入特征进行回归预测,适用于连续值输出问题。 性能对比:对比不同优化算法在训练集和测试集上的预测性能,绘制适应度曲线、预测对比图、误差指标柱状图等。 2.算法步骤 数据准备:导入数据,随机打乱,划分训练集和测试集(默认7:3)。 数据归一化:使用mapminmax将输入和输出归一化到[0,1]区间。 标准RBF建模:使用固定spread=100建立基准RBF模型。 智能优化循环: 调用优化算法(从指定文件夹中读取算法文件)优化spread参数。 使用优化后的spread重新训练RBF网络。 评估预测结果,保存性能指标。 结果可视化: 绘制适应度曲线、训练集/测试集预测对比图。 绘制误差指标(MAE、RMSE、MAPE、MBE)柱状图。 十种智能优化算法分别是: GWO:灰狼算法 HBA:蜜獾算法 IAO:改进天鹰优化算法,改进①:Tent混沌映射种群初始化,改进②:自适应权重 MFO:飞蛾扑火算法 MPA:海洋捕食者算法 NGO:北方苍鹰算法 OOA:鱼鹰优化算法 RTH:红尾鹰算法 WOA:鲸鱼算法 ZOA:斑马算法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值