hdu3861 The King’s Problem【强连通+最小路径覆盖】
来源:互联网 发布:单片机中断系统有啥 编辑:程序博客网 时间:2024/06/02 07:12
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3861
题意:一个国王掌管着n做城市,有m条有向道路,为了方便管理,国王要把这n个城市划分成尽可能少的集合,首先强连通必须是一个集合里面,除此之外,一个集合里面的任意两点需要满足,u可以达到v,或者v可以达到u,问你最少的集合数
解析:强连通缩点以后,就相当于问你用最少的不重叠路径去覆盖这个图,那也就是最小路径覆盖,所以再做一次二分图匹配即可
#include<bits/stdc++.h>using namespace std;const int maxn = 5000+100;vector<int>G[maxn];vector<int>rG[maxn];vector<int>G2[maxn];vector<int>vs;int match[maxn];int vis[maxn],cmp[maxn];void init(int n){ for(int i=0;i<=n;i++) { G[i].clear(),rG[i].clear(); G2[i].clear(); } vs.clear(); memset(vis,0,sizeof(vis)); memset(match,-1,sizeof(match));}void dfs(int u){ vis[u] = 1; for(int i=0;i<(int)G[u].size();i++) { if(!vis[G[u][i]]) dfs(G[u][i]); } vs.push_back(u);}void rdfs(int u,int k){ vis[u] = 1; cmp[u] = k; for(int i=0;i<(int)rG[u].size();i++) { if(!vis[rG[u][i]]) rdfs(rG[u][i],k); }}int scc(int n){ for(int i=1;i<=n;i++) { if(!vis[i]) dfs(i); } int k = 0; memset(vis,0,sizeof(vis)); for(int i=n-1;i>=0;i--) { if(!vis[vs[i]]) rdfs(vs[i],k++); } return k;}int dfs2(int u){ for(int i=0;i<(int)G2[u].size();i++) { int v=G2[u][i]; if(!vis[v]) { vis[v]=1; if(match[v]==-1||dfs2(match[v])) { match[v]=u; return 1; } } } return 0;}int slove(int n){ int k = scc(n); for(int i=1;i<=n;i++) { for(int j=0;j<(int)G[i].size();j++) { int v = G[i][j]; if(cmp[i]!=cmp[v]) G2[cmp[i]].push_back(cmp[v]); } } memset(match,-1,sizeof(match)); int ans=0; for(int i=0;i<k;i++) { memset(vis,0,sizeof(vis)); if(dfs2(i)) ans++; } return k-ans;}int main(){ int t,n,m; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); init(n); for(int i=0;i<m;i++) { int x,y; scanf("%d%d",&x,&y); G[x].push_back(y); rG[y].push_back(x); } printf("%d\n",slove(n)); }}
阅读全文
0 0
- hdu3861 The King’s Problem【强连通+最小路径覆盖】
- hdu3861 The King’s Problem (强连通+最小路径覆盖)
- hdu3861 The King’s Problem (强连通缩点+最小路径覆盖)
- hdu3861 The King’s Problem --- 强连通+二分图
- HDU 3861 The King’s Problem 强连通+最小路径覆盖
- hdu 3861 The King’s Problem (强连通+最小路径覆盖)
- HDU 3861 The King’s Problem(强连通+二分图最小路径覆盖)
- hdu 3681The King’s Problem(强连通分量+最小路径覆盖)
- HDU - 3861 The King’s Problem(强连通分量+最小路径覆盖)
- HDU 3861The King’s Problem 强连通分量分解 + 二分图最小路径覆盖
- hdu 3861 The King’s Problem【强连通Kosaraju+最小路径覆盖】
- hdu 1269 The King’s Problem(强连通分量+缩点+最小路径覆盖)
- HDU3861 The King’s Problem Tarjan缩点+二分图求最小路径覆盖
- HDU3861-The King’s Problem(有向图强连通缩点+最小路径覆盖)
- HDU3861(强连通+最小覆盖路径)
- HDU 3861 The King’s Problem (强连通分量缩点+二分图匹配最小路径覆盖)
- hdu3861The King’s Problem (强连通 缩点+最小路径覆盖)
- hdu3861 The King’s Problem 强连通分量+二分图匹配
- All-Pairs Shortest Paths – Floyd Warshall Algorithm
- R语言学习-创建新的矩阵matrix
- JDBC(5)—DatabaseMetaData
- 鼠标滑过边框加阴影css3
- ios中UILabel的使用
- hdu3861 The King’s Problem【强连通+最小路径覆盖】
- PHP资源大全
- 如何在移动设备上调试html5开发的网页
- 一个简单拓扑排序的 java 实现
- c语言实现mmap内存映射读取文件和文件加密
- 输入数字列号获取EXCEL的列编号
- WEB端通过语音盒子拨打电话
- 信工所六室面试经历
- UVA11732 strcmp() Anyone?(Trie树)