缩点+图论路径网络流:1114T4
http://cplusoj.com/d/senior/p/SS231114D
重新梳理一下题目
我们先建图 x → y x\to y x→y,然后对点分类:原串出现点,原串未出现点。
假如我们对一个原串出现点进行了操作,那么它剩余所有出边我们立刻去操作必然没有影响。所以我们只要所有原串出现点都操作一遍即可(如果有出边),那么我们就把边问题变成了点问题。
考虑一次置换过程抽象为原串上的一条链,那必然会造成一个损失。而要消除这个损失,一个方法是使链的尾端为原串未出现点。
对于图上路径问题,我们可以直接缩点,因为一个强连通里,我们必然可以从一个进一个出。最后变成了一个DAG。
这就变成了一个二分图问题。每个点可以向其连通的点连边,只要满足这个点还有出度,或者这个点为原串未出现点。
而左边为匹配的点就是代价了。
#include<bits/stdc++.h>
using namespace std;
#ifdef LOCAL#define debug(...) fprintf(stdout, ##__VA_ARGS__)
#else#define debug(...) void(0)
#endif
//#define int long long
inline int read(){int x=0,f=1;char ch=getchar(); while(ch<'0'||
ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;}
#define Z(x) (x)*(x)
#define pb push_back
#define fi first
#define se second
//srand(time(0));
#define N 150
//#define M
//#define mo
namespace Flow {#define int long longstruct mf_graph {struct node {int x, y, z, n; }; vector<node>d; vector<int>h, H, dep; queue<int>q; int k; int u, v, w, S, T, ans=0; void reset(int n) {h.resize(n+5); k=1; d.resize(2); H.resize(n+5); dep.resize(n+5); }void cun(int x, int y, int z) {++k; d.pb({x, y, z, h[x]}); d[k].n=h[x]; h[x]=k;}void add_edge(int x, int y, int z) {
// swap(x, y);
// debug("%lld -> %lld %lld\n", x, y, z); cun(x, y, z); cun(y, x, 0); }int bfs() {while(!q.empty()) q.pop(); fill(dep.begin(), dep.end(), -1); h=H; dep[S]=1; q.push(S); while(!q.empty()) {u=q.front(); q.pop(); for(int g=h[u]; g; g=d[g].n) {v=d[g].y; w=d[g].z; if(w<=0 || dep[v]!=-1) continue; dep[v]=dep[u]+1; q.push(v); }}return dep[T]!=-1; }int dfs(int x, int w) {if(x==T) return w;if(!w) return 0; int ans=0, s; for(int &i=h[x]; i; i=d[i].n) {int y=d[i].y, z=d[i].z; if(dep[y]!=dep[x]+1) continue; if(z<=0) continue; s=dfs(y, min(w, z)); ans+=s; w-=s; d[i].z-=s; d[i^1].z+=s; if(!w) break; }return ans; }int flow(int SS, int TT) {S=SS; T=TT; H=h; while(bfs()) ans+=dfs(S, 1e18); return ans; }}; #undef int
}
using namespace Flow;
int n, m, i, j, k, S, T, TT;
vector<int>G[N], Ge[N];
int c[N], p[N], dfn[N], low[N], col[N], pan[N];
int vis[N][N], tot, tott, x, y, ans, cnt, shu[N], pp[N];
char str[N];
stack<int>z; void init() {for(i=0; i<=150; ++i) G[i].clear(), Ge[i].clear(); memset(c, 0, sizeof(c)); memset(p, 0, sizeof(p)); memset(dfn, 0, sizeof(dfn)); memset(low, 0, sizeof(low)); memset(col, 0, sizeof(col)); memset(vis, 0, sizeof(vis)); memset(shu, 0, sizeof(shu)); memset(pp, 0, sizeof(pp)); tott=0;
}void dfs(int x) {
// debug("> %d %c\n", x, x); dfn[x]=low[x]=++tott; z.push(x); for(int y : G[x]) {if(dfn[y]==-1) continue; if(!dfn[y]) dfs(y), low[x]=min(low[x], low[y]); else low[x]=min(low[x], dfn[y]); }if(dfn[x]==low[x]) {
// debug("tot : %d\n", tot); ++tot; while(z.top()!=x) col[z.top()]=tot, dfn[z.top()]=-1, z.pop(); col[z.top()]=tot, z.pop(); dfn[x]=-1; }
// dfn[x]=-1;
}void dfs2(int x, int st) {vis[st][x]=1; pan[x]=1;
// debug("%d <=> %d\n", x, st); for(int y : Ge[x]) {if(pan[y]) continue; dfs2(y, st); }
}signed main()
{
// freopen("machine.in", "r", stdin);
// freopen("machine.out", "w", stdout);#ifdef LOCALfreopen("in.txt", "r", stdin);freopen("out.txt", "w", stdout);#endifTT=read();while(TT--) {init(); scanf("%s", str+1); m=read(); for(i=1; str[i]; ++i) c[str[i]]++; for(i=k=0; i<=128; ++i) if(c[i]) ++k; //k为种类 n=k; debug("n : %lld\n", n); for(i=1; i<=m; ++i) {scanf("%s", str+1); x=str[1]; y=str[2];
// swap(x, y);
// printf("%c %c\n", x, y);
// if(!c[x]) continue; G[x].pb(y); p[x]=p[y]=1; if(c[x]) pp[x]=1; }mf_graph Gow; Gow.reset(600); tott=tot=0; S=599; T=S-1; for(i=0; i<=128; ++i) if(p[i] && !dfn[i]) {dfs(i); //debug(">> %lld\n", i); }for(i=0; i<=128; ++i) if(p[i] || c[i]) debug("%c %d %d %d | %d\n", i, c[i], p[i], pp[i], col[i]);
// for(i=0; i<=128; ++i) if(p[i] && c[i] && !pp[i]) --n; // printf("tot : %d | %d\n", tot, n); for(x=0; x<=128; ++x) if(p[x]) {for(int y : G[x]) if(col[x]!=col[y]) {
// printf("# (%d %d) %d -> %d\n", x, y, col[x], col[y]); Ge[col[x]].pb(col[y]); }}
// continue; for(i=1; i<=128; ++i) {if(pp[i]) shu[col[i]]|=1; if(c[i]) shu[col[i]]|=2; }for(i=1, cnt=0; i<=tot; ++i) {
// debug("shu[%d] = %d\n", i, shu[i]); if((shu[i]&1)==0) continue; memset(pan, 0, sizeof(pan)); dfs2(i, i); ++cnt; debug("Kuai : %d\n", i); for(j=1; j<=tot; ++j) if(vis[i][j]) {if(i==j) continue; if((shu[j]&1)==1 && (shu[j]&2)==0) continue; if((shu[j]&1)==0) continue;
// printf("%d %d\n", i, j); Gow.add_edge(i, j+150, 1);
// Gow.add_edge(j, i+150, 1); }for(j=0; j<=128; ++j) if(p[j] && !c[j] && vis[i][col[j]]) {debug("Col %d -> %d\n", i, j); Gow.add_edge(i, j+300, 1); }}debug("cnt : %d\n", cnt); for(i=0; i<150; ++i) Gow.add_edge(S, i, 1); for(i=151; i<=500; ++i) Gow.add_edge(i, T, 1); ans=Gow.flow(S, T); debug("ans1 : %d\n", ans); ans=cnt-ans; debug("ans2 : %d\n", ans); ans=n-ans; printf("%d\n", ans); }return 0;
}

相关文章:
缩点+图论路径网络流:1114T4
http://cplusoj.com/d/senior/p/SS231114D 重新梳理一下题目 我们先建图 x → y x\to y x→y,然后对点分类:原串出现点,原串未出现点。 假如我们对一个原串出现点进行了操作,那么它剩余所有出边我们立刻去操作必然没有影响。所…...
Go语言fyne开发桌面应用程序-环境安装
环境安装 参考https://developer.fyne.io/started/#prerequisites网站 之前的文章介绍了如何安装GO语言这里不在叙述 msys2 首先安装msys2,https://www.msys2.org/ 开始菜单打开MSYS2 执行 $ pacman -Syu$ pacman -S git mingw-w64-x86_64-toolchain注意&#…...
JavaWeb——CSS3的使用
目录 1. CSS概述 2. CSS引入方式 3. CSS颜色显示 4. CSS选择器 4.1. 元素(标签)选择器 4.2. id选择器 4.3. 类选择器 4.4. 三者优先级 5. 盒子模型 1. CSS概述 CSS,全称为“Cascading Style Sheets”,中文译为“层叠样式…...
AR导览小程序开发方案
一、背景介绍 随着科技的不断发展,虚拟现实(VR)和增强现实(AR)技术逐渐被应用于各个领域。其中,AR导览小程序作为一种新兴的导览方式,以其独特的视觉体验和互动性受到了广泛的关注。AR导览小程…...
继承、多态
复习 需求: 编写一个抽象类:职员Employee,其中定义showSalary(int s)抽象方法;编写Employee的子类,分别是销售员Sales和经理Manager,分别在子类中实现对父类抽象方法的重写,并编写测试类Test查看输出结果 package cn.…...
贪吃蛇小游戏代码
框架区 package 结果;import java.awt.Color; import java.awt.EventQueue; import java.awt.Font; import java.awt.Frame; import java.awt.Graphics; import java.awt.Image; import java.util.ArrayList; import java.util.List; import java.util.Random;import javax.s…...
Python数据容器(字典)
字典 1.字典的定义2.字典数据的获取3.字典的嵌套4.嵌套字典的内容获取5.字典的常用操作6.常用操作总结7.遍历字典8.练习 1.字典的定义 同样使用{},不过存储的元素是一个一个的:键值对,语法如下 # 定义字典字面量 {key:value,key:value,...,…...
餐饮展示小程序的作用是什么
餐饮是市场重要的组成部分,尤其是我国八大菜系,各类细分菜数量非常多,并分布在全国,各类大小品牌餐饮商家数量也非常庞大,每个城市的商业街都是一个接一个餐厅,酒类、酒店多样。 餐饮行业经营痛点比较明显…...
33、Flink 的Table API 和 SQL 中的时区
Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…...
Origin:科研绘图与学术图表绘制从入门到精通
文章目录 一、引言二、安装和启动Origin三、创建和保存图表四、深入学习Origin绘图功能五、应用Origin进行科研绘图和学术图表绘制六、总结与建议《Origin科研绘图与学术图表绘制从入门到精通》亮点内容简介作者简介目录获取方式 一、引言 Origin是一款功能强大的数据分析和科…...
腾讯云标准型SA4服务器AMD处理器性能测评
腾讯云服务器标准型SA4实例CPU采用AMD处理器,新一代腾讯云自研星星海双路服务器,搭配AMD EPYC Genoa处理器,内存采用最新 DDR5,默认网络优化,最高内网收发能力达4500万pps,最高内网带宽可支持100Gbps。阿腾…...
LeetCode 2656. K 个元素的最大和:一次遍历(附Python一行版代码)
【LetMeFly】2656.K 个元素的最大和:一次遍历(附Python一行版代码) 力扣题目链接:https://leetcode.cn/problems/maximum-sum-with-exactly-k-elements/ 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。你需要执行以下操…...
element-ui中Form表单使用自定义验证规则
data() {const validatePass (rule, value, callback) > {if (value.length < 3) {callback(new Error("密码不能小于3位"));} else {callback();}};return {rules: {password: [{ required: true, trigger: "blur", validator: validatePass },]}}…...
android源码添加adb host支持
本文开始参考在 android 上使用 adb client-CSDN博客,在shell中已经可以使用。但当我想在app中用 String command "/data/local/tmp/adb -s 307ef90dc8128844 shell ls";StringBuilder output new StringBuilder();try {Process process Runtime.getR…...
学习c#的第二天
目录 C# 基本语法 using 关键字 class 关键字 C# 中的注释 成员变量 成员函数 类的实例化 标识符 C# 关键字 C# 基本语法 C# 是一种面向对象的编程语言。在面向对象的程序设计方法中,程序由各种相互交互的对象组成。相同种类的对象通常具有相同的类型&…...
CodeWhisperer 使用经验分享
今天给大家分享一下 Amazon CodeWhisperer 编程工具(免费哦),使用这个软件后我的编码质量提升不少,给大家分享一下我的经验。希望大家支持哦。 Amazon CodeWhisperer 是亚⻢逊出品的一款基于机器学习的 AI 编程助手,可…...
数据结构与算法之美学习笔记:18 | 散列表(上):Word文档中的单词拼写检查功能是如何实现的?
目录 前言散列思想散列函数散列冲突解答开篇 前言 本节课程思维导图: Word 的单词拼写检查功能,虽然很小但却非常实用。你有没有想过,这个功能是如何实现的呢?其实啊,一点儿都不难。只要你学完今天的内容,…...
解决java发邮件错误javax.net.ssl.SSLHandshakeException: No appropriate protocol
java发送邮件时报以下错误信息: javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher [com.bm6api.controller.v1.AppUserController] - sendLoginAuthCodeMail 发送登录验证码邮件 : {"code":200,"inf…...
杭电oj 2035 人见人爱A^B C语言
#include<stdio.h>void main() {int a, b, i,num;while (~scanf_s("%d%d", &a, &b) && (a ! 0 || b ! 0)){num a;for (i 1; i < b; i){num * a;num % 1000;}printf("%d\n", num);} }...
[量化投资-学习笔记017]Python+TDengine从零开始搭建量化分析平台-异常处理
一个完成的程序一定少不了对异常的处理,以及错误日志的输出。 在之前章节的程序中对这两部分没有进行说明,以下用两个单独的章节进行介绍。 [量化投资-学习笔记016]PythonTDengine从零开始搭建量化分析平台-日志输出 异常处理 Python 通常使用 try .. except 和防…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...
Element-Plus:popconfirm与tooltip一起使用不生效?
你们好,我是金金金。 场景 我正在使用Element-plus组件库当中的el-popconfirm和el-tooltip,产品要求是两个需要结合一起使用,也就是鼠标悬浮上去有提示文字,并且点击之后需要出现气泡确认框 代码 <el-popconfirm title"是…...
AT模式下的全局锁冲突如何解决?
一、全局锁冲突解决方案 1. 业务层重试机制(推荐方案) Service public class OrderService {GlobalTransactionalRetryable(maxAttempts 3, backoff Backoff(delay 100))public void createOrder(OrderDTO order) {// 库存扣减(自动加全…...
解密鸿蒙系统的隐私护城河:从权限动态管控到生物数据加密的全链路防护
摘要 本文以健康管理应用为例,展示鸿蒙系统如何通过细粒度权限控制、动态权限授予、数据隔离和加密存储四大核心机制,实现复杂场景下的用户隐私保护。我们将通过完整的权限请求流程和敏感数据处理代码,演示鸿蒙系统如何平衡功能需求与隐私安…...
数据库管理与高可用-MySQL故障排查与生产环境优化
目录 #1.1MySQL单案例故障排查 1.1.1MySQL常见的故障排查 1.1.2MySQL主从故障排查 #2.1MySQL优化 2.1.1硬件方面的优化 2.1.2进程方面的优化 #3.1MySQL存储引擎 3.1.1 MyISAM存储引擎 3.1.2 InnoDB存储引擎 1.1MySQL单案例故障排查 1.1.1MySQL常见的故障排查 (1&…...
SpringSecurity+vue通用权限系统
SpringSecurityvue通用权限系统 采用主流的技术栈实现,Mysql数据库,SpringBoot2Mybatis Plus后端,redis缓存,安全框架 SpringSecurity ,Vue3.2Element Plus实现后台管理。基于JWT技术实现前后端分离。项目开发同时采 …...
