【Trie】【费用流】管道监控(loj 3026)

2024-01-29 23:32
文章标签 管道 监控 费用 trie loj 3026

本文主要是介绍【Trie】【费用流】管道监控(loj 3026),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

正题

loj 3026


题目大意

给你一棵树,和若干匹配串,如果一个节点向下的某条链构成了匹配串i,则可以花费这w_i匹配这条链,问你匹配完所有点的最小代价


解题思路

这题可以理解为树上树上的线性规划

先对于每个匹配串倒着建trie,然后每个点向父亲跑trie,当跑到一个匹配串时,就连接头和尾,费用为 w i w_i wi,流量inf

然后每个点向子节点连流量inf费用0的边

s向叶子节点连流量1费用0的边,如果一个点的子节点大于1就把多余的流到t,1要把所有流量流到t

就在树上找到匹配串,然后就是经典的线性规划


代码

#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define N 510
#define M 1000100
using namespace std;
ll n, m, T, x, s, t, w, tot, ans, sum, summ;
ll h[N], f[N], b[N], fr[N], fa[N], deg[N], v[M], wh[M], to[M][26];
char cl[N], st[M];
bool p[N];
queue<ll>d;
const ll inf = 1e15;
struct rec
{ll to, next, f, w, c;
}e[N*N<<2];
void add(ll x, ll y, ll f, ll c, ll w)
{e[++tot].to = y;e[tot].f = f;e[tot].w = w;//编号e[tot].c = c;e[tot].next = h[x];h[x] = tot;e[++tot].to = x;e[tot].f = 0;e[tot].w = 0;e[tot].c = -c;e[tot].next = h[y];h[y] = tot;return;
}
void insert(ll x, char* s, ll whi)
{ll now = 0, len = strlen(s+1);for (ll i = len; i > 0; --i){ll y = s[i] - 97;if (!to[now][y]) to[now][y] = ++w;now = to[now][y];}if (!v[now] || x < v[now]){v[now] = x;wh[now] = whi;}return;
}
void dfs(ll x)
{ll now = 0;for (ll i = x; i != 1; i = fa[i]){ll y = cl[i] - 97;if (!to[now][y]) break;now = to[now][y];if (v[now]) add(x, fa[i], inf, v[now], wh[now]);}return;
}
bool spfa()
{memset(b, 127/3, sizeof(b));memset(f, 0, sizeof(f));memset(p, 0, sizeof(p));while(!d.empty()) d.pop();d.push(s);p[s] = 1;b[s] = 0;f[s] = inf;while(!d.empty()){ll u = d.front();d.pop();for (ll i = h[u]; i; i = e[i].next){ll v = e[i].to;if (b[u] + e[i].c < b[v] && e[i].f){fr[v] = i;b[v] = b[u] + e[i].c;f[v] = min(f[u], e[i].f);if (!p[v]){p[v] = 1;d.push(v);}}}p[u] = 0;}return f[t];
}
void dfs()
{ll now = t;while(fr[now]){e[fr[now]].f -= f[t];e[fr[now]^1].f += f[t];now = e[fr[now]^1].to;}ans += f[t] * b[t];sum += f[t];return;
}
int main()
{scanf("%lld%lld%lld", &n, &m, &T);tot = 1;for (ll i = 2; i <= n; ++i){scanf("%lld", &x);fa[i] = x;add(x, i, inf, 0, 0);deg[x]++; cl[i] = getchar();while(cl[i] < 'a' || 'z' < cl[i]) cl[i] = getchar();}s = n + 1;t = n + 2;for (ll i = 1; i <= m; ++i){scanf("%lld%s", &x, st+1);insert(x, st, i);}for (ll i = 2; i <= n; ++i){dfs(i);if (!deg[i]) add(s, i, 1, 0, 0);else if (deg[i] > 1){add(i, t, deg[i] - 1, 0, 0);//多的流掉summ += deg[i] - 1;//计算理论总流量}}add(1, t, deg[1], 0, 0);summ += deg[1];while(spfa())dfs();if (sum < summ)//有的边到不了{puts("-1");return 0;}printf("%lld\n", ans);if (T){ans = 0;for (ll i = 2; i <= n; ++i)for (ll j = h[i]; j; j = e[j].next)if (e[j].w && e[j].f < inf)//输出方案ans++;printf("%lld\n", ans);for (ll i = 2; i <= n; ++i)for (ll j = h[i]; j; j = e[j].next)if (e[j].w && e[j].f < inf)printf("%lld %lld %lld\n", e[j].to, i, e[j].w);}return 0;
}

这篇关于【Trie】【费用流】管道监控(loj 3026)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/658509

相关文章

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

Redis Pipeline(管道) 详解

《RedisPipeline(管道)详解》Pipeline管道是Redis提供的一种批量执行命令的机制,通过将多个命令一次性发送到服务器并统一接收响应,减少网络往返次数(RTT),显著提升执行效率... 目录Redis Pipeline 详解1. Pipeline 的核心概念2. 工作原理与性能提升3. 核

AJAX请求上传下载进度监控实现方式

《AJAX请求上传下载进度监控实现方式》在日常Web开发中,AJAX(AsynchronousJavaScriptandXML)被广泛用于异步请求数据,而无需刷新整个页面,:本文主要介绍AJAX请... 目录1. 前言2. 基于XMLHttpRequest的进度监控2.1 基础版文件上传监控2.2 增强版多

Redis中管道操作pipeline的实现

《Redis中管道操作pipeline的实现》RedisPipeline是一种优化客户端与服务器通信的技术,通过批量发送和接收命令减少网络往返次数,提高命令执行效率,本文就来介绍一下Redis中管道操... 目录什么是pipeline场景一:我要向Redis新增大批量的数据分批处理事务( MULTI/EXE

Linux中的进程间通信之匿名管道解读

《Linux中的进程间通信之匿名管道解读》:本文主要介绍Linux中的进程间通信之匿名管道解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、基本概念二、管道1、温故知新2、实现方式3、匿名管道(一)管道中的四种情况(二)管道的特性总结一、基本概念我们知道多

Linux命名管道方式

《Linux命名管道方式》:本文主要介绍Linux命名管道方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、命名管道1、与匿名管道的关系2、工作原理3、系统调用接口4、实现两个进程间通信二、可变参数列表总结一、命名管道1、与匿名管道的关系命名管道由mkf

Linux使用nload监控网络流量的方法

《Linux使用nload监控网络流量的方法》Linux中的nload命令是一个用于实时监控网络流量的工具,它提供了传入和传出流量的可视化表示,帮助用户一目了然地了解网络活动,本文给大家介绍了Linu... 目录简介安装示例用法基础用法指定网络接口限制显示特定流量类型指定刷新率设置流量速率的显示单位监控多个

通过prometheus监控Tomcat运行状态的操作流程

《通过prometheus监控Tomcat运行状态的操作流程》文章介绍了如何安装和配置Tomcat,并使用Prometheus和TomcatExporter来监控Tomcat的运行状态,文章详细讲解了... 目录Tomcat安装配置以及prometheus监控Tomcat一. 安装并配置tomcat1、安装

C#实现系统信息监控与获取功能

《C#实现系统信息监控与获取功能》在C#开发的众多应用场景中,获取系统信息以及监控用户操作有着广泛的用途,比如在系统性能优化工具中,需要实时读取CPU、GPU资源信息,本文将详细介绍如何使用C#来实现... 目录前言一、C# 监控键盘1. 原理与实现思路2. 代码实现二、读取 CPU、GPU 资源信息1.

使用zabbix进行监控网络设备流量

《使用zabbix进行监控网络设备流量》这篇文章主要为大家详细介绍了如何使用zabbix进行监控网络设备流量,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录安装zabbix配置ENSP环境配置zabbix实行监控交换机测试一台liunx服务器,这里使用的为Ubuntu22.04(