ZJOI2012 网络

本文探讨了在处理特定图算法问题时,如何利用LCT(Link-Cut Tree)进行高效的操作。针对一个涉及多色图的复杂场景,文章详细介绍了如何为每种颜色维护一棵LCT,以实现对图的动态修改和查询。文中还分享了在实现过程中需要注意的细节,如直接相连边的颜色识别、点的度数维护、特殊情形的处理以及节点权重更新后的树调整。

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

传送门

首先吐槽一下……这题还吓唬你。都说了图中没有同色环,还说什么“所有可能从u到v的简单路径”,就一条……

很显然就是每一种颜色维护一个LCT。因为颜色很少所以多开几棵就行。

有一些要注意的:

1.在修改的时候,首先我们得先找到连接这两个点的边原来是什么颜色的。这个必须是直接相连,因为有可能这两个点在多种颜色中都是联通的(在一棵\(splay\)中),但是不是直接连边的。我的做法是用map维护,虽然常数大不过其实开了O2还挺快……

2.修改边的时候要维护一下点的度数,对于error2,需要判断一下是否已经联通。

3.有人说要特判更改颜色和原来一样的情况。我的写法不需要……因为我是直接模拟,先切开,不行再连上……

4.注意修改点权之后务必要\(splay\)一次,0分变100……

#include<bits/stdc++.h>
#define rep(i,a,n) for(register int i = a;i <= n;i++)
#define per(i,n,a) for(register int i = n;i >= a;i--)
#define I inline
using namespace std;
typedef long long ll;
const int M = 20005;

I ll read()
{
   ll ans = 0,op = 1;char ch = getchar();
   while(ch < '0' || ch > '9') {if(ch == '-') op = -1;ch = getchar();}
   while(ch >='0' && ch <= '9') ans = ans * 10 + ch - '0',ch = getchar();
   return ans * op;
}

int n,m,c,k,u,v,w,vi[M],op,x,y;

struct LCT
{
    int ch[M][2],fa[M],rev[M],val[M],maxn[M],sta[M],top,deg[M];
    map <int,bool> edge[M];
    I bool get(int x) {return ch[fa[x]][1] == x;}
    I bool nroot(int x) {return (ch[fa[x]][0] == x) || (ch[fa[x]][1] == x);}
    I void rever(int x) {swap(ch[x][0],ch[x][1]),rev[x] ^= 1;}
    I void pushup(int x) {maxn[x] = max(val[x],max(maxn[ch[x][0]],maxn[ch[x][1]]));}
    I void pushdown(int x) {if(rev[x]) rever(ch[x][0]),rever(ch[x][1]),rev[x] = 0;}
    I void rotate(int x)
    {
        int y = fa[x],z = fa[y],k = get(x);
        if(nroot(y)) ch[z][get(y)] = x;
        fa[x] = z,ch[y][k] = ch[x][k^1],fa[ch[x][k^1]] = y;
        ch[x][k^1] = y,fa[y] = x;
        pushup(y),pushup(x);
    }
    I void splay(int x)
    {
        int p = x; sta[++top] = p;
        while(nroot(p)) p = fa[p],sta[++top] = p;
        while(top) pushdown(sta[top--]);
        while(nroot(x))
        {
            int y = fa[x],z = fa[y];
            if(nroot(y)) ((ch[z][0] == y) ^ (ch[y][1] == x)) ? rotate(x) : rotate(y);
            rotate(x);
        }
    }
    I void access(int x) {for(int g = 0;x;g = x,x = fa[x]) splay(x),ch[x][1] = g,pushup(x);}
    I void makeroot(int x) {access(x),splay(x),rever(x);}
    I int findroot(int x)
    {
        access(x),splay(x);
        while(ch[x][0]) pushdown(x),x = ch[x][0];
        return x;
    }
    I void split(int x,int y) {makeroot(x),access(y),splay(y);}
    I void link(int x,int y) {makeroot(x);if(findroot(y) != x) fa[x] = y,deg[x]++,deg[y]++,edge[x][y] = 1,edge[y][x] = 1;}
    I void cut(int x,int y)
    {
        makeroot(x);
        if(findroot(y) != x || fa[x] != y || ch[x][1]) return;
        ch[y][0] = fa[x] = 0,deg[x]--,deg[y]--,edge[x][y] = 0,edge[y][x] = 0,pushup(y);
    }
}T[10];

I int findcolor(int u,int v)
{
    rep(i,0,c-1) if(T[i].edge[u][v] == 1) return i;
    return -1;
}

int main()
{
    n = read(),m = read(),c = read(),k = read();
    rep(i,1,n) 
    {   
        vi[i] = read();
        rep(j,0,c-1) T[j].val[i] = T[j].maxn[i] = vi[i]; 
    }
    rep(i,1,m) u = read(),v = read(),w = read(),T[w].link(u,v);
    while(k--)
    {
        op = read();
        if(op == 0) {x = read(),y = read();rep(i,0,c-1) T[i].val[x] = y,T[i].splay(x);}
        else if(op == 1) 
        {
            u = read(),v = read(),w = read();
            int d = findcolor(u,v);
            if(d == -1) {printf("No such edge.\n");continue;} 
            T[d].cut(u,v);
            if(T[w].deg[u] + 1 > 2 || T[w].deg[v] + 1 > 2) {printf("Error 1.\n"),T[d].link(u,v);continue;}
            T[w].makeroot(u);
            if(T[w].findroot(v) == u) {printf("Error 2.\n"),T[d].link(u,v);continue;}
            T[w].link(u,v),printf("Success.\n");
        }
        else if(op == 2)
        {
            w = read(),u = read(),v = read();
            T[w].makeroot(u);
            if(T[w].findroot(v) != u) printf("-1\n");
            else T[w].split(u,v),printf("%d\n",T[w].maxn[v]);
        }
    }
    return 0;
}

转载于:https://www.cnblogs.com/captain1/p/10275913.html

内容概要:本文介绍了基于SMA-BP黏菌优化算法优化反向传播神经网络(BP)进行多变量回归预测的项目实例。项目旨在通过SMA优化BP神经网络的权重和阈值,解决BP神经网络易陷入局部最优、收敛速度慢及参数调优困难等问题。SMA算法模拟黏菌寻找食物的行为,具备优秀的全局搜索能力,能有效提高模型的预测准确性和训练效率。项目涵盖了数据预处理、模型设计、算法实现、性能验证等环节,适用于多变量非线性数据的建模和预测。; 适合人群:具备一定机器学习基础,特别是对神经网络和优化算法有一定了解的研发人员、数据科学家和研究人员。; 使用场景及目标:① 提升多变量回归模型的预测准确性,特别是在工业过程控制、金融风险管理等领域;② 加速神经网络训练过程,减少迭代次数和训练时间;③ 提高模型的稳定性和泛化能力,确保模型在不同数据集上均能保持良好表现;④ 推动智能优化算法与深度学习的融合创新,促进多领域复杂数据分析能力的提升。; 其他说明:项目采用Python实现,包含详细的代码示例和注释,便于理解和二次开发。模型架构由数据预处理模块、基于SMA优化的BP神经网络训练模块以及模型预测与评估模块组成,各模块接口清晰,便于扩展和维护。此外,项目还提供了多种评价指标和可视化分析方法,确保实验结果科学可信。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值