有向无环图(DAG)的最小路径覆盖
来源:互联网 发布:韩国东大门淘宝店推荐 编辑:程序博客网 时间:2024/05/21 06:13
原博客
DAG的最小路径覆盖
定义:在一个有向图中,找出最少的路径,使得这些路径经过了所有的点。
最小路径覆盖分为最小不相交路径覆盖和最小可相交路径覆盖。
最小不相交路径覆盖:每一条路径经过的顶点各不相同。如图,其最小路径覆盖数为3。即1->3>4,2,5。
最小可相交路径覆盖:每一条路径经过的顶点可以相同。如果其最小路径覆盖数为2。即1->3->4,2->3>5。
特别的,每个点自己也可以称为是路径覆盖,只不过路径的长度是0。
DAG的最小不相交路径覆盖
算法:把原图的每个点V拆成$V_x$和$V_y$两个点,如果有一条有向边A->B,那么就加边$A_x->B_y$。这样就得到了一个二分图。那么最小路径覆盖=原图的结点数-新图的最大匹配数。
证明:一开始每个点都是独立的为一条路径,总共有n条不相交路径。我们每次在二分图里找一条匹配边就相当于把两条路径合成了一条路径,也就相当于路径数减少了1。所以找到了几条匹配边,路径数就减少了多少。所以有最小路径覆盖=原图的结点数-新图的最大匹配数。
因为路径之间不能有公共点,所以加的边之间也不能有公共点,这就是匹配的定义。
习题:POJ 1422
DAG的最小可相交路径覆盖
算法:先用floyd求出原图的传递闭包,即如果a到b有路径,那么就加边a->b。然后就转化成了最小不相交路径覆盖问题。
证明:为了连通两个点,某条路径可能经过其它路径的中间点。比如1->3->4,2->4->5。但是如果两个点a和b是连通的,只不过中间需要经过其它的点,那么可以在这两个点之间加边,那么a就可以直达b,不必经过中点的,那么就转化成了最小不相交路径覆盖。
题目:POJ2594
#include<cstdio>#include<cstring>#include<cmath>#include<iostream>#include<algorithm>#include<vector>using namespace std;int n,m,x,y;int a[555][555];int p[555];int v[555];void aa()//缩点,若有1-3 ,3-2 则有1-2{ for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { if(a[i][k]&&a[k][j]) a[i][j]=1; }}int dfs(int u){ for(int i=1;i<=n;i++) { if(!v[i]&&a[u][i]) { v[i]=1; if(!p[i]||dfs(p[i])) { p[i]=u; return 1; } } } return 0;}int main(){ while(~scanf("%d%d",&n,&m)&&n+m) { memset(a,0,sizeof(a)); memset(p,0,sizeof(p)); for(int i=1;i<=m;i++) { scanf("%d%d",&x,&y); a[x][y]=1; } aa(); int sum=0; for(int i=1;i<=n;i++) { memset(v,0,sizeof(v)); if(dfs(i)) sum++; } printf("%d\n",n-sum); }}
阅读全文
0 0
- 有向无环图(DAG)的最小路径覆盖
- 有向无环图(DAG)的最小路径覆盖
- 有向无环图(DAG)的最小路径覆盖
- 有向无环图(DAG)的最小路径覆盖
- hdu 1151 DAG图(有向无环图)的最小路径覆盖
- 有向无环图的最小路径覆盖
- 有向无环图的最小路径覆盖nefu481
- nefu481有向无环图的最小路径覆盖
- hdu1151有向无环图的最小路径覆盖
- UVAlive3126 Taxi Cab Scheme(DAG的最小路径覆盖)
- [网络流24题] 03 最小路径覆盖问题(有向无环图最小路径覆盖,网络最大流)
- poj2594(DAG最小路径覆盖)
- HDU1151有向图的最小路径覆盖
- nefu486魔术球问题【有向无环图最小路径覆盖】
- POJ3249 工作难题(DAG有向无环图的单源最短路径)
- zoj 1525 Air Raid 有向无环图的最小路径覆盖(匹配)
- poj 1422 Air Raid 有向无环图的最小路径覆盖
- hdu 1151 Air Raid DaG 图的最小路径覆盖
- 用JAVA写一个简单的21点游戏(不设置庄主的情况下)
- 通过ajaxFileUpload控件上传图片,java后台接收并保存本地
- VitualBox安装centos虚拟机
- 数据结构实验之图论三:判断可达性(BFS算法)
- Java中Synchronized的用法
- 有向无环图(DAG)的最小路径覆盖
- 使用递归制作树形结构
- kafka to hdfs
- ubuntu如何删除无效的应用图标
- 指向字符串的指针 ------ 字符串指针
- SQL语句参数化(用%s)
- Spring 使用注解方式进行事务管理
- Snapchat SDE 电面+onsite面经
- vb.net 教程 3-13 动态创建控件2