当前位置: 首页 > news >正文

Solution - P2764 最小路径覆盖问题

说几句与这题无关的闲话。

学校好傻逼啊为什么要在学竞赛的时候突然把我们抓回去上文化。


说回正题。

这题要求最小路径覆盖。最小路径覆盖的一个经典解法就是拆点,建二分图。

输出路径的话在残量网络上找流完的边然后随便搞搞即可。

#include <bits/stdc++.h>
#define llong long long
#define N 155
using namespace std;#define bs (1<<20)
char buf[bs], *p1, *p2;
#define gc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,bs,stdin),p1==p2)?EOF:*p1++)
template<typename T>
inline void read(T& x){x = 0; int w = 1;char ch = gc();while(ch < '0' || ch > '9'){if(ch == '-') w = -w;ch = gc();}while(ch >= '0' && ch <= '9')x = (x<<3)+(x<<1)+(ch^48), ch = gc();x *= w;
}
template<typename T, typename ...Args>
inline void read(T& x, Args& ...y){return read(x), read(y...);
}bitset<N> G[N];
vector<int> g[N];
int n, m;int to[N*N], siz[N*N], nxt[N*N], head[N<<1], gsiz = 1;
#define mkarc(u,v,w) (++gsiz, to[gsiz]=v, siz[gsiz]=w, nxt[gsiz]=head[u], head[u]=gsiz)
int cur[N<<1], lev[N<<1];int que[N<<1], he, ta;
inline bool bfs(){for(int i = 1; i <= n*2+2; ++i) lev[i] = 0, cur[i] = head[i];que[he = ta = 1] = n*2+1, lev[n*2+1] = 1;while(he <= ta){int u = que[he++];if(u == n*2+2) return true;for(int i = head[u]; i; i = nxt[i]){int v = to[i];if(lev[v] || !siz[i]) continue;lev[v] = lev[u]+1;que[++ta] = v;}}return false;
}
inline int dfs(int u, int f){if(u == n*2+2) return f;int res = 0;for(int &i = cur[u]; i; i = nxt[i]){int v = to[i];if(lev[v] != lev[u]+1 || !siz[i]) continue;int d = dfs(v, min(f, siz[i]));if(!d) lev[v] = -1;siz[i] -= d, f -= d;siz[i^1] += d, res += d;if(!f) break;}return res;
}
inline int dinic(){int res = 0;while(bfs()) res += dfs(n*2+1, 1e9+7);return res;
}int nxt2[N], deg[N];int main(){freopen("in.txt", "r", stdin);read(n, m);for(int i = 1; i <= m; ++i){int u, v; read(u, v);g[u].push_back(v);G[u][v] = true;}
//	for(int k = 1; k <= n; ++k)
//		for(int i = 1; i <= n; ++i)
//			if(G[i][k]) G[i] |= G[k];for(int i = 1; i <= n; ++i)for(int j = 1; j <= n; ++j)if(G[i][j] && i != j) mkarc(i, j+n, 1), mkarc(j+n, i, 0);for(int i = 1; i <= n; ++i){mkarc(n*2+1, i, 1), mkarc(i, n*2+1, 0);mkarc(i+n, n*2+2, 1), mkarc(n*2+2, i+n, 0);}int ans = n-dinic();for(int u = 1; u <= n; ++u)for(int i = head[u]; i; i = nxt[i])if(!siz[i] && to[i] <= n*2) nxt2[u] = to[i]-n, ++deg[to[i]-n];for(int i = 1; i <= n; ++i){if(deg[i]) continue;for(int j = i; j; j = nxt2[j])printf("%d ", j);printf("\n");}printf("%d", ans);return 0;
}
http://www.jsqmd.com/news/412253/

相关文章:

  • 国货封神!2026宝妈必藏国产儿童鞋服品牌清单,颜值质感双在线 - 品牌测评鉴赏家
  • 软件低通滤波器(附代码)
  • pc移动端自适应软件库网站源码
  • 餐饮店点餐小程序开源源码
  • Kubernetes(K8s)全面详解与实战指南
  • 发货100文章商品付费阅读系统源码
  • PostgreSQL 入门学习教程,从入门到精通,PostgreSQL 16 (Windows) 安装与核心语法实战指南(2)
  • 基于CEEMDAN-CNN-BiLSTM的多变量输入单步风电功率预测研究附Matlab代码
  • 基于西门子plc 博图 1200 药片自动 装瓶 机控制系统设计 1.仿真+报告(1.5W字)...
  • 2026最新十大知名全屋定制板材品牌推荐榜!优质环保品质与高性价比源头厂家选择指南,适配全空间定制需求 - 十大品牌榜
  • Jmeter和Postman那个工具更适合做接口测试?
  • 上海直饮水机代理商怎么选?5家靠谱供应商推荐 - 小坤哥
  • 程序员藏书神器!本本书屋onlinetoolsland.com 解锁技术学习高效路径
  • scFv 分子稳定性优化:核心策略与关键技术
  • 利用开源工具打造个人数字图书馆:从网络资源到本地管理的技术实践
  • 从资源索引到知识管理:利用“本本书屋”与开源工具构建个人数字图书馆
  • 基于CasADi框架的模型预测控制(MPC)方法,应用于质点车辆模型的轨迹跟踪问题附Matlab代码
  • COGS 3349. [HSOI 2020
  • 人工智能之数学基础:高阶导数
  • 搭建个人知识库:从“本本书屋”出发的电子书管理技术实践
  • 绕过技术书籍的“付费墙”:一个程序员如何用开源思维打造免费知识库
  • [豪の算法奇妙冒险] 代码随想录算法训练营第四十五天 | 115-不同的子序列、583-两个字符串的删除操作、72-编辑距离
  • 人工智能之数学基础:一元函数链式法则
  • 2025年电网校招录用人数Top50大学排名
  • 海康VM通信常见应用方式详细解释
  • Skoltech等机构揭秘:当AI压缩技术遭遇“信息堵车“时会发生什么
  • 上海科技大学+上海AI实验室:当AI助手被“越狱“后会做什么?
  • SaaS产品VS实物产品:哪个更适合新手推广?
  • 2026年“最稳”的5家央国企:比公务员还香,没人敢说
  • SkillsBench:斯坦福大学等机构揭秘AI代理“技能包“的真实威力