先找出强连通分量缩点,然后就是最小路径覆盖。
构造一个二分图,把每个点\(i\)拆成两个点\(X_i,Y_i\)。
对于原图中的边\(u \to v\),在二分图添加一条边\(X_u \to Y_v\)。

  • 最小路径覆盖 = 顶点个数 - 最大匹配数
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <stack>
using namespace std;const int maxn = 5000 + 10;
const int maxm = 100000 + 10;struct Edge
{int v, nxt;Edge() {}Edge(int v, int nxt): v(v), nxt(nxt) {}
};int ecnt, head[maxn];
Edge edges[maxm];void AddEdge(int u, int v) {edges[ecnt] = Edge(v, head[u]);head[u] = ecnt++;
}int n, m;stack<int> S;
int dfs_clock, pre[maxn], low[maxn];
int scc_cnt, sccno[maxn];void dfs(int u) {pre[u] = low[u] = ++dfs_clock;S.push(u);for(int i = head[u]; ~i; i = edges[i].nxt) {int v = edges[i].v;if(!pre[v]) {dfs(v);low[u] = min(low[u], low[v]);} else if(!sccno[v]) low[u] = min(low[u], pre[v]);}if(low[u] == pre[u]) {scc_cnt++;for(;;) {int x = S.top(); S.pop();sccno[x] = scc_cnt;if(x == u) break;}}
}void find_scc() {dfs_clock = scc_cnt = 0;memset(pre, 0, sizeof(pre));memset(sccno, 0, sizeof(sccno));for(int i = 1; i <= n; i++) if(!pre[i])dfs(i);
}int ecnt2, head2[maxn];
Edge edges2[maxm];
int left[maxn];
bool vis[maxn];void AddEdge2(int u, int v) {edges2[ecnt2] = Edge(v, head2[u]);head2[u] = ecnt2++;
}bool find(int u) {for(int i = head2[u]; ~i; i = edges2[i].nxt) {int v = edges2[i].v;if(vis[v]) continue;vis[v] = true;if(!left[v] || find(left[v])) {left[v] = u;return true;}}return false;
}int main()
{int T; scanf("%d", &T);while(T--) {scanf("%d%d", &n, &m);ecnt = 0;memset(head, -1, sizeof(head));while(m--) {int u, v; scanf("%d%d", &u, &v);AddEdge(u, v);}find_scc();ecnt2 = 0;memset(head2, -1, sizeof(head2));for(int u = 1; u <= n; u++) {for(int i = head[u]; ~i; i = edges[i].nxt) {int v = edges[i].v;if(sccno[u] == sccno[v]) continue;AddEdge2(sccno[u], sccno[v]);}}int match = 0;memset(left, 0, sizeof(left));for(int i = 1; i <= scc_cnt; i++) {memset(vis, 0, sizeof(vis));if(find(i)) match++;}printf("%d\n", scc_cnt - match);}return 0;
}

转载于:https://www.cnblogs.com/AOQNRMGYXLMV/p/5352478.html

HDU 3861 The King’s Problem 强连通分量 最小路径覆盖相关推荐

  1. HDU 3861 The King’s Problem (强连通缩点+DAG最小路径覆盖)

    <题目链接> 题目大意: 一个有向图,让你按规则划分区域,要求划分的区域数最少. 规则如下:1.所有点只能属于一块区域:2,如果两点相互可达,则这两点必然要属于同一区域:3,区域内任意两点 ...

  2. The King’s Problem(tarjan求强连通分量缩点+匈牙利求有向无环图的最小路径覆盖)

    Link:http://acm.hdu.edu.cn/showproblem.php?pid=3861 The King's Problem Time Limit: 2000/1000 MS (Jav ...

  3. 有向图最小路径覆盖方法浅析、证明 //hdu 3861

    路径覆盖就是在图中找一些路径,使之覆盖了图中的所有顶点,且任何一个顶点有且只有一条路径与之关联. 对于一个有向无环图怎么求最小路径覆盖? 先构造二分图: 对于原图,先拆点,吧每个点i拆成ii,iii. ...

  4. (hdu step 6.3.3)Air Raid(最小路径覆盖:求用最少边把全部的顶点都覆盖)

    题目: Air Raid Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...

  5. 玲珑学院OJ 1130 - 喵哈哈村的魔法大师╳灬兲笙疯癫°月【强连通+可相交最小路径覆盖+背包】

    1130 - 喵哈哈村的魔法大师╳灬兲笙疯癫°月 Time Limit:1s Memory Limit:256MByte Submissions:196Solved:23 DESCRIPTION ╳灬 ...

  6. poj 1904 King's Quest 强连通分量+匹配

    ========== 题目链接King's Quest ============ 题解:通过原有的完美匹配,反向建边,在同一个强连通分量里面的王子和公主可以匹配,而不影响其他王子的结婚对象. //#i ...

  7. 迷宫城堡 HDU - 1269 (塔尖算法求强连通分量)

    为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A房间和B房间,只说明可以 ...

  8. HDU - 1151 Air Raid(最小路径覆盖-二分图最大匹配)

    题目链接:点击查看 题目大意:给出一个有向图,现在需要在不同的地方空降伞兵,保证所有伞兵沿着道路可以走完所有城市,求出最少伞兵的数量 题目分析:我们的目的是要用最少的路径覆盖所有顶点,换句话说就是二分 ...

  9. 分析打开hdu 3335 (最小路径覆盖)

    在写这篇文章之前,xxx已经写过了几篇关于改分析打开主题的文章,想要了解的朋友可以去翻一下之前的文章 点击打开链接 分析: 被坑了... 敲击三遍,WA了三遍... 发明很多学同,之间二分模版都过了. ...

最新文章

  1. 硬件delay评估表
  2. Azure Stack运维工具Azure Stack Tools的使用及实战
  3. Java实现复数Complex的加减乘除运算、取模、求幅角角度
  4. java支持的数据类型有哪些_Java支持的数据类型有哪些?什么时候自动装拆箱?...
  5. 关于C#GB2312编码问题
  6. Vs code 设置缩进两个字符
  7. win10系统安装Webloic12C操作方法
  8. 云原生赋能传统行业软件离线交付
  9. vivado_hls 与 modelsim 联合仿真时报错,Failed to access library ‘unisims_ver‘ at “unisims_ver“
  10. 服务器winsxs文件夹怎么清理工具,如何清理Win7系统winsxs文件夹中的垃圾?
  11. 什么原因可能会造成Android手机卡顿?
  12. 树莓派:64位 RPI OS(Bullseye) 更换国内源
  13. 深入浅出OpenGL三维渲染管线
  14. 入门系列之改进小波阈值降噪
  15. VBA 类模块理解和使用总结
  16. 法大大登榜《胡润中国瞪羚企业》
  17. 3Dmax 通过wrl生成地形
  18. soapui 证书_配置https双向认证,以及用soapui调试
  19. 在 Spring Boot 中使用 HikariCP 连接池
  20. 如果孔子是个程序员,一定是P14

热门文章

  1. RhinoMock入门(6)——安装结果和约束
  2. HP的“高端”磁带库!
  3. 两种不同字符串比较方法的性能对比
  4. 面试题 03.05. 栈排序
  5. 测试面试题集-Dubbo常见面试题
  6. Python接口自动化之cookie、session应用
  7. Compound社区发起一项讨论 向5000名早期活跃用户发放总供应量5%的COMP代币
  8. SAP License:我们到底需要什么能力?
  9. SAP License:SAP打油诗
  10. 【Spark调优】内存模型与参数调优