POJ 2594 传递闭包+最小路径覆盖
2016-07-22 15:03
393 查看
传送门
思路:
因为有些地方间接可达,所以要先求传递闭包,把完整的可达矩阵求出来。
思路:
因为有些地方间接可达,所以要先求传递闭包,把完整的可达矩阵求出来。
#include<cstring> #include<cstdio> #include<iostream> #include<cmath> #include<algorithm> #include<queue> #include<vector> using namespace std; #define LL long long #define INF 0x3f3f3f3f const int MAXN=510; int uN,vN;//u,v数目 int g[MAXN][MAXN]; int linker[MAXN]; bool used[MAXN]; bool dfs(int u)//从左边开始找增广路径 { int v; for(v=1;v<=vN;v++)//这个顶点编号从0开始,若要从1开始需要修改 if(g[u][v]&&!used[v]) { used[v]=true; if(linker[v]==-1||dfs(linker[v])) {//找增广路,反向 linker[v]=u; return true; } } return false;//这个不要忘了,经常忘记这句 } int hungary() { int res=0; int u; memset(linker,-1,sizeof(linker)); for(u=1;u<=uN;u++)//从0开始 { memset(used,0,sizeof(used)); if(dfs(u)) res++; } return res; } void floyed(int n)//求传递闭包 { for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++) { if(g[i][j]==0) { for(int k=1;k<=n;k++) { if(g[i][k]==1&&g[k][j]==1) { g[i][j]=1; break; } } } } } } int n,k; int u,v; int main(){ while(~scanf("%d%d",&n,&k),n||k){ memset(g,0,sizeof(g)); uN=vN=n; while(k--){ scanf("%d%d",&u,&v); g[u][v]=1; } floyed(n); printf("%d\n",n-hungary()); } return 0; }
相关文章推荐
- (原创开源)CnCrypt 快速启动工具(CnCrypt磁盘加密伪装程序),VS2015编译
- 关于微软面试100题系列中两道题目的个人解法
- 软件系统界面--通用列表规范
- 基于Servlet+JSP+JavaBean开发
- iOS开发之制作@2x和缩小图片
- 三极管9014 管脚
- 面向对象设计——创建对象
- Spring包的方法WebUtils.getParametersStartingWith(request,String)
- dotnet il editor 调试 iis 程序
- 带权值的并查集
- 矩阵的特征值分解与奇异值分解的几何意义
- [225] Implement Stack using Queues
- window.onload与$(document).ready()区别
- Java并发
- 2016多校联合第二场 HDU5735 B. Born Slippy 【树状dp剪枝优化】
- 基于jackson的json与对象互相转换
- CreateThread六个参数设置详解
- linux socket 编程(二)
- slide
- Mysql数据库的导出