题意:最小路径覆盖

题解:对于一个有向图,最小点覆盖 = 顶点数 - 最大匹配

   这里的最大匹配指的是将原图中每一个点拆成入点、出点, 每条边连接起点的出点和终点的入点

   源点S连接每个点的出点,汇点T连接每个点的入点,这样建出来的二分图的最大匹配

   然后输出路径被坑了很久 因为自己拆点的标号问题吧

   我的拆点方式入点是偶数 出点是奇数 然后特判哪里就要写清楚

#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
int n, m, s, t, cnt, maxflow; struct node {
int to, nex, val;
}E[20005];
int head[305];
int cur[305]; void addedge(int x, int y, int va) {
E[++cnt].to = y; E[cnt].nex = head[x]; head[x] = cnt; E[cnt].val = va;
E[++cnt].to = x; E[cnt].nex = head[y]; head[y] = cnt; E[cnt].val = 0;
} int inque[305];
int dep[305];
int to[305];
bool bfs() {
for(int i = 0; i <= n * 2 + 1; i++) cur[i] = head[i], inque[i] = 0, dep[i] = INF;
queue<int> que;
dep[s] = 0; inque[s] = 1;
que.push(s); while(!que.empty()) {
int u = que.front();
que.pop();
inque[u] = 0; for(int i = head[u]; i; i = E[i].nex) {
int v = E[i].to;
if(E[i].val > 0 && dep[v] > dep[u] + 1) {
dep[v] = dep[u] + 1;
if(!inque[v]) {
inque[v] = 1;
que.push(v);
}
}
}
}
if(dep[t] != INF) return true;
return false;
} int vis;
int viss[155];
int dfs(int x, int flow) {
if(x == t) {
vis = 1;
maxflow += flow;
return flow;
} int used = 0;
int rflow = 0;
for(int i = cur[x]; i; i = E[i].nex) {
cur[x] = i;
int v = E[i].to;
if(E[i].val > 0 && dep[v] == dep[x] + 1) {
if(rflow = dfs(v, min(flow - used, E[i].val))) {
if(v != t && x != s && (x % 2 == 0) && (v % 2 == 1)) to[x / 2] = v / 2, viss[v / 2] = 1;
used += rflow;
E[i].val -= rflow;
E[i ^ 1].val += rflow;
if(used == flow) break;
}
}
}
return used;
} void dinic() {
maxflow = 0;
while(bfs()) {
vis = 1;
while(vis) {
vis = 0;
dfs(s, INF);
}
}
} int main() {
scanf("%d%d", &n, &m);
s = 0, t = 1;
cnt = 1;
for(int i = 1; i <= n; i++) {
addedge(s, i << 1, 1);
addedge(i << 1 | 1, t, 1);
} for(int i = 1; i <= m; i++) {
int a, b;
scanf("%d%d", &a, &b);
addedge(a << 1, b << 1 | 1, INF);
}
dinic();
int ans = n - maxflow;
for(int i = 1; i <= n; i++) {
if(!viss[i]) {
printf("%d", i);
for(int j = to[i]; j; j = to[j]) printf(" %d", j);
puts("");
}
}
printf("%d\n", ans);
return 0;
}

最新文章

  1. Linux 客户端访问 NFS报Permission Denied错误
  2. weiphp布署在sina sae图片显示不了问题
  3. 《BI项目笔记》用Excel2013连接和浏览OLAP多维数据集
  4. Shell 操作练习
  5. 转:不是技术牛人,如何拿到国内IT巨头的Offer
  6. static_cast 和 dynamic_cast 的区别
  7. Java for selenium(webdriver) 环境搭建
  8. BZOJ 4010: [HNOI2015]菜肴制作( 贪心 )
  9. 正确理解Python文件读写模式字w+、a+和r+
  10. 团队作业4——第一次项目冲刺(Alpha版本)6th day
  11. MPSOC之2——ubuntu环境配置及petalinux安装
  12. SQL 2005/2008 连接SQL 2000报18456错误
  13. ASP.NET Core Mvc中空返回值的处理方式
  14. 【apache】No input file specified
  15. pache tomcat慢速HTTP拒绝服务攻击安全问题解决办法
  16. 【Tools】-NO.89.Tools.4.Visual Studio 2017.1.001-【Visual Studio 2017 安装与卸载】-
  17. 十八. Python基础(18)常用模块
  18. Spring Boot 揭秘与实战(七) 实用技术篇 - FreeMarker 模板引擎
  19. (原)torch7中指定可见的GPU
  20. 【Oracle】数据泵导入导出

热门文章

  1. SIGGRAPH Asia 2020 电脑动画节(CAF)获奖短片出炉!
  2. 【Linux】fstab中 每个字段代表的含义
  3. 【Oracle】表空间配额问题
  4. leetcode 940. 不同的子序列 II (动态规划 ,字符串, hash,好题)
  5. 避免用using包装DbContext【翻译】
  6. Mysql--由prepared sql statement引发的问题
  7. SpringBoot快速掌握(1):核心技术
  8. 十一、UART&amp;TTY驱动
  9. Cisco IOS
  10. h3c交换机配置ssh密码验证登录方式