abc374 g

在这里插入图片描述
很容易想到建图,初始想法为,建完图后,求一个最小路径覆盖,但因为整个图不是DAG,所以需要缩点,但路径覆盖有两种说法,一种是最小不相交路径覆盖,另一种是最小可相交路径覆盖。
对于最小不相交路径覆盖,我们可以采用求二分图最大匹配来解决,因为每个点最多只有一个前驱节点和后继节点,因此将一个点拆成两个,即可转换为二分图。
对于最小可相交路径覆盖,每个点的前驱节点和后继节点的个数不在保证至多为1,所以我们需要先进行一遍传递闭包,例如a->b->c->d,我们对于中间的不关心,我们只关心最终的结果,即a可以到达d,中间的过程我们不关心,因为可以重复覆盖。由此就转化为了最小不相交路径覆盖问题。

对于建图,我们不能将字母和字母之间直接建图,例如 A B AB AB,我们就建一条从 A A A B B B的边,这样是不可行的,有以下反例:ab,bc,ac,如果我们按照上述进行建图,我们最终得到的答案为1,因为我们只需要一个abc的字符串即可,但对于字符串ac,其并没有作为子串进行出现。
所以正确的建图方式为:双重循环遍历,当两个字符串,其中一个开头的字母和另一个结尾的字母相同时,我们就再这两个串之间建一条边即可。

 #include <bits/stdc++.h>
using namespace std;
const int N = 4e5 + 5;
typedef long long ll;
const int maxv = 4e6 + 5;
typedef pair<ll, ll> pll;
typedef array<int,3> ar;
// #define endl "\n"
int mod=998244353;constexpr int inf = 1E9;
template<class T>
struct MaxFlow {struct _Edge {int to;T cap;_Edge(int to, T cap) : to(to), cap(cap) {}};int n;std::vector<_Edge> e;std::vector<std::vector<int>> g;std::vector<int> cur, h;MaxFlow() {}MaxFlow(int n) {init(n);}void init(int n) {this->n = n;e.clear();g.assign(n, {});cur.resize(n);h.resize(n);}bool bfs(int s, int t) {h.assign(n, -1);std::queue<int> que;h[s] = 0;que.push(s);while (!que.empty()) {const int u = que.front();que.pop();for (int i : g[u]) {auto [v, c] = e[i];if (c > 0 && h[v] == -1) {h[v] = h[u] + 1;if (v == t) {return true;}que.push(v);}}}return false;}T dfs(int u, int t, T f) {if (u == t) {return f;}auto r = f;for (int &i = cur[u]; i < int(g[u].size()); ++i) {const int j = g[u][i];auto [v, c] = e[j];if (c > 0 && h[v] == h[u] + 1) {auto a = dfs(v, t, std::min(r, c));e[j].cap -= a;e[j ^ 1].cap += a;r -= a;if (r == 0) {return f;}}}return f - r;}void addEdge(int u, int v, T c) {g[u].push_back(e.size());e.emplace_back(v, c);g[v].push_back(e.size());e.emplace_back(u, 0);}T flow(int s, int t) {T ans = 0;while (bfs(s, t)) {cur.assign(n, 0);ans += dfs(s, t, std::numeric_limits<T>::max());}return ans;}std::vector<bool> minCut() {std::vector<bool> c(n);for (int i = 0; i < n; i++) {c[i] = (h[i] != -1);}return c;}struct Edge {int from;int to;T cap;T flow;};std::vector<Edge> edges() {std::vector<Edge> a;for (int i = 0; i < e.size(); i += 2) {Edge x;x.from = e[i + 1].to;x.to = e[i].to;x.cap = e[i].cap + e[i + 1].cap;x.flow = e[i + 1].cap;a.push_back(x);}return a;}
};int n, m, tot, dfsn[N], ins[N], low[N];
stack<int> s;
vector<int> e[N];
vector<vector<int>> scc;
vector<int> b(N);void dfs(int x)
{low[x] = dfsn[x] = ++tot, ins[x] = 1, s.push(x);for (auto u : e[x]){if (!dfsn[u]){dfs(u);low[x] = min(low[x], low[u]);}else if (ins[u])low[x] = min(low[x], dfsn[u]);}if (dfsn[x] == low[x]){vector<int> c;while (1){auto t = s.top();c.push_back(t);ins[t] = 0;s.pop();b[t] = scc.size();// z[scc.size()]+=a[t];if (t == x)break;}scc.push_back(c);}
}void add(int u, int v)
{e[u].push_back(v);
}MaxFlow<int> mf;int w[1005][1005];void solve()
{cin>>n;// vector<int> st(30);string ss[n+5];for(int i=0;i<n;i++) cin>>ss[i];for (int i = 0; i < n; ++i) {for (int j = 0; j < n; ++j) {if (ss[i].back() == ss[j].front())e[i].push_back(j);}}for(int i=0;i<n;i++){// if(!st[i]) continue;if(!dfsn[i]) dfs(i);}mf.init(n*n*2+5);int s=n*n+1,t=n*n+2;for(int i=0;i<n;i++){for(auto j: e[i]){if(b[i]!=b[j]){w[b[i]][b[j]]=1;}}}int res=scc.size();// cout<<res<<endl;for(int k=0;k<res;k++){for(int i=0;i<res;i++){for(int j=0;j<res;j++){if(i==j) continue;if(w[i][k]&&w[k][j]) w[i][j]=1;}}}for(int i=0;i<res;i++){for(int j=0;j<res;j++){if(w[i][j]&&i!=j) mf.addEdge(i,j+res,1);}mf.addEdge(s,i,1),mf.addEdge(i+res,t,1);}cout<<res-mf.flow(s,t)<<endl;
}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t = 1;// cin>>t;while (t--){solve();}system("pause");return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1558795.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Linux-更多的结构化命令

for命令 C语言风格的for语句 while命令 until命令 嵌套循环 循环处理文件数据 控制循环-break命令 控制循环-continue命令 处理循环输出 实例&#xff1a;查询可执行文件、创建多个用户账户

【华为OD机试真题】95、最少面试官数

package mainimport ("fmt""sort" )type s struct {start intend intworkCount int }type duration struct {start intend int }// 查询时间段内是否有可用的面试官 func getFreeS(sList []*s, d *duration, workCountLimit int) (sIndex int)…

DASCTF 2024暑期挑战赛wp

WEB 题目&#xff1a;Sanics revenge 解题步骤 首先看到给出的附件: from sanic import Sanic import os from sanic.response import text, html import sys import random import pydash # pydash5.1.2 # 这里的源码好像被admin删掉了一些&#xff0c;听他说里面藏有大秘密 c…

两个pdf怎么合并成一个pdf?超简单的合并方法分享

在日常工作和学习中&#xff0c;我们经常会遇到需要将多个PDF文件合并成一个文件的情况&#xff0c;以便更好地管理和分享。今天&#xff0c;将为大家详细介绍5种实用的方法&#xff0c;能够一键合并多个PDF文件&#xff0c;有需要的小伙伴快来一起学习下吧。 方法一&#xff1…

车牌字符识别系统源码分享

车牌字符识别系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision …

霍普菲尔德(Hopfield)神经网络求解旅行商问题TSP,提供完整MATLAB代码,复制粘贴即可运行

Hopfield神经网络是以美国物理学家约翰霍普菲尔德&#xff08;John Hopfield&#xff09;的名字命名的。他在1982年提出了这种类型的神经网络模型&#xff0c;因此通常被称为Hopfield网络。旅行商问题&#xff08;Traveling Salesman Problem&#xff0c;TSP&#xff09;是一个…

Linux文件权限与用户管理详解:权限、所属用户组和所有者的变更

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storm…

七氟烷麻醉药市场研究:未来几年年复合增长率CAGR为4.2%

七氟烷是一种吸入麻醉剂&#xff0c;用于在外科手术过程中诱导和维持全身麻醉。七氟烷是一种挥发性麻醉剂&#xff0c;常用于在外科手术过程中诱导和维持全身麻醉。它因起效快和作用消失快而受到青睐&#xff0c;是成人和儿科患者的理想选择。七氟烷通常通过吸入起作用&#xf…

考研报名记录冲冲冲

研究生报名 网址 https://yz.chsi.com.cn/apply/ 报名包括网上报名和网上确认两个阶段&#xff0c;所有考生均须在规定时间内参加网上报名和网上确认。网上报名时间为2024年10月15日至10月28日&#xff08;网上预报名时间为2024年10月9日至10月12日&#xff0c;网上预报名和正…

计算机中的BIOS是什么?BIOS设置界面怎么进入?

计算机术语中我们常说的BIOS是基本输入输出系统&#xff08;Basic Input & Output System&#xff09;的简称。它是一组固化在计算机主板上的ROM芯片中的程序&#xff0c;计算机启动时最早运行的软件之一。它保存着计算机最重要的基本输入输出的程序、开机自检程序和系统自…

wordpress使用popup弹窗插件的对比

您在寻找最好的 WordPress 弹出插件吗&#xff1f;大多数网站利用某种形状或形式的弹出窗口来将访问者指向他们希望他们去的地方。例如&#xff0c;这可能用于结帐、电子邮件订阅或用于生成潜在客户。 表现 弹出插件会减慢您的网站速度。当插件使用 WordPress 跟踪弹出窗口的…

SQL注入之报错注入方法汇总

报错注入 什么是报错注入 0.1 定义&#xff1a; 报错注入是通过特殊函数错误使用并使其输出错误结果来获取信息的。是一种页面响应形式。 响应过程&#xff1a; 用户在前台页面输入检索内容后台将前台页面上输入的检索内容无加区别的拼接成sql语句&#xff0c;送给数据库执…

VR科技云展如何以沉浸式体验引领科技成果新展示

一、VR科技云展的展示方式 VR科技云展通过虚拟现实技术&#xff0c;将展厅移植到虚拟空间中&#xff0c;使观众可以通过互联网在线参观展览。这种展示方式打破了时间和空间的限制&#xff0c;观众只需通过电脑、平板、手机等设备&#xff0c;就能随时随地体验展览。 1、沉浸式漫…

压缩图片最简单的方法有哪些?2024帮助你压缩出你需要的文件大小的软件

压缩图片最简单的方法有哪些&#xff1f;2024帮助你压缩出你需要的文件大小的软件 压缩图片可以帮助减少文件大小&#xff0c;从而更方便地进行存储、传输或上传到网站。以下是五款好用的图片压缩软件&#xff0c;它们能够帮助你快速、轻松地压缩图片至所需的文件大小。 万能图…

讲座在线预约管理系统的设计与实现使用SpringBootSSM框架开发

目录 摘要 1 引言 2 系统需求分析 3 技术选型 4 系统架构设计 5 核心功能实现 5.1 用户管理 5.2 讲座管理 5.3 预约管理 5.4 评论系统 6 安全性考虑 7 测试 8 结论 摘要 本文旨在设计和实现一个基于Spring Boot SSM框架的讲座在线预约管理系统&#xff0c;并结合…

makefile常见问题记录

1 Makefile:8 *** missing separator. Stop. 可能原因1&#xff1a;makefile的命令行开头必须使用Tab键 如图1所示&#xff0c;红框内为一个命令行&#xff0c;图2的缩进由敲空格实现&#xff0c;会标红&#xff0c;报错&#xff0c;图3的缩进为按Tab键&#xff0c;语法正确&…

YOLO11改进|卷积篇|引入轻量级自适应提取卷积LAE

目录 一、【LAE】卷积1.1【LAE】卷积介绍1.2【LAE】核心代码 二、添加【LAE】卷积机制2.1STEP12.2STEP22.3STEP32.4STEP4 三、yaml文件与运行3.1yaml文件3.2运行成功截图 一、【LAE】卷积 1.1【LAE】卷积介绍 下图是【LAE】卷积的结构图&#xff0c;让我们简单分析一下运行过程…

指针式表盘指针关键部位分割系统源码&数据集分享

指针式表盘指针关键部位分割系统源码&#xff06;数据集分享 [yolov8-seg-LSKNet&#xff06;yolov8-seg-C2f-EMSC等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challenge 项目来源AAAI Gl…

人工智能、人机交互和机器人国际学术会议

第三届人工智能、人机交互和机器人国际学术会议 &#xff08;AIHCIR 2024&#xff09;组委会热忱地邀请您参与本届大会。本届大会旨在聚集领先的科学家、研究人员和学者&#xff0c;共同交流和分享在人工智能、人机交互和机器人各个方面的经验和研究成果&#xff0c;为研究人员…

【千库网-注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…