P2764 最小路径覆盖问题

问题描述:

给定有向图\(G=(V,E)\)。设\(P\) 是\(G\) 的一个简单路(顶点不相交)的集合。如果\(V\) 中每个顶点恰好在\(P\) 的一条路上,则称\(P\)是\(G\) 的一个路径覆盖。\(P\) 中路径可以从\(V\) 的任何一个顶点开始,长度也是任意的,特别地,可以为\(0\)。\(G\) 的最小路径覆盖是\(G\)的所含路径条数最少的路径覆盖。设计一个有效算法求一个有向无环图\(G\) 的最小路径覆盖。

提示:设\(V={1,2,.... ,n}\),构造网络\(G_1=(V_1,E_1)\)

如下:

\(V_1=\{x_1,x_2,...,x_n\}\cup\{y_1,y_2,...y_n\}\)

\(E_1=\{(x_0,x_i):i\in V\}\cup\{(y_0,y_i):i\in E \}\cup\{(x_i,y_j):(i,j)\in E\}\)

即每条边的容量均为1。求网络\(G_1\)最大流。

输入输出格式

输入格式:

件第1 行有2个正整数\(n\)和\(m\)。\(n\)是给定有向无环图\(G\) 的顶点数,\(m\)是\(G\) 的边数。接下来的\(m\)行,每行有\(2\) 个正整数\(i\)和\(j\),表示一条有向边\((i,j)\)。

输出格式:

从第1 行开始,每行输出一条路径。文件的最后一行是最少路径数。

说明

\(1<=n<=150,1<=m<=6000\)

由@zhouyonglong提供SPJ


其实提示说的很清楚了。

这里用我自己的感性语言解释一下。

描述:将图中每个点拆成两个,分成两个图。把连原来的边连上。跑二分图匹配,最小路径数=总点数-最大匹配数

解释:

不难发现,路径数+路径集合中边的数量=总点数。(肽链)

总点数不变,我们就可以转化到求最大的边的数量。

而对于原图中的每一个点\(i\),都可以分成以下四中情况。

为了使边的数量尽量大,我们应该多令情况(3)出现。

而这几种情况中又一个点最多戳某一个点屁股,也只能被最多被一个戳。

那么,劈配? 匹配?

再看看我们跑的二分图是什么,是不是很明了~


CODE:

#include <cstdio>
#include <cstring>
const int N=160;
int n,m;
struct edge
{
int to,next;
}g[N*N];
int head[N],cnt=0;
void add(int u,int v)
{
g[++cnt].to=v;
g[cnt].next=head[u];
head[u]=cnt;
}
int used[N],match[N];
bool m_find(int u)
{
for(int i=head[u];i;i=g[i].next)
{
int v=g[i].to;
if(!used[v])
{
used[v]=1;
if(!match[v]||m_find(match[v]))
{
match[v]=u;
return true;
}
}
}
return false;
} void dfs(int now)
{
if(!match[now]) {printf("%d ",now);return;}
dfs(match[now]); printf("%d ",now);
} int main()
{
scanf("%d%d",&n,&m);
int u,v;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&u,&v);
add(u,v);
}
int ans=0;
for(int i=1;i<=n;i++)
{
memset(used,0,sizeof(used));
if(m_find(i)) ans++;
}
memset(used,0,sizeof(used));
for(int i=1;i<=n;i++)
used[match[i]]=1;
for(int i=1;i<=n;i++)
if(!used[i])
{dfs(i);printf("\n");}
printf("%d\n",n-ans);
return 0;
}

2018.5.6

洛谷 P2764 最小路径覆盖问题 解题报告的更多相关文章

  1. 洛谷 P2764 最小路径覆盖问题【最大流+拆点+路径输出】

    题目链接:https://www.luogu.org/problemnew/show/P2764 题目描述 «问题描述: 给定有向图G=(V,E).设P 是G 的一个简单路(顶点不相交)的集合.如果V ...

  2. 洛谷P2764 最小路径覆盖问题

    有向无环图的最小路径点覆盖 最小路径覆盖就是给定一张DAG,要求用尽量少的不相交的简单路径,覆盖有向无环图的所有顶点. 有定理:顶点数-路径数=被覆盖的边数. 要理解的话可以从两个方向: 假设DAG已 ...

  3. 【刷题】洛谷 P2764 最小路径覆盖问题

    题目描述 «问题描述: 给定有向图G=(V,E).设P 是G 的一个简单路(顶点不相交)的集合.如果V 中每个顶点恰好在P 的一条路上,则称P是G 的一个路径覆盖.P 中路径可以从V 的任何一个顶点开 ...

  4. 洛谷P2764 最小路径覆盖问题(最大流)

    传送门 先说做法:把原图拆成一个二分图,每一个点被拆成$A_i,B_i$,若原图中存在边$(u,v)$,则连边$(A_u,B_v)$,然后$S$对所有$A$连边,所有$B$对$T$连边,然后跑一个最大 ...

  5. 洛谷 P2764 最小路径覆盖问题【匈牙利算法】

    经典二分图匹配问题.把每个点拆成两个,对于原图中的每一条边(i,j)连接(i,j+n),最小路径覆盖就是点数n-二分图最大匹配.方案直接顺着匹配dsf.. #include<iostream&g ...

  6. 洛谷 P2764(最小路径覆盖=节点数-最大匹配)

    给定有向图G=(V,E).设P 是G 的一个简单路(顶点不相交)的集合.如果V 中每个顶点恰好在P 的一条路上,则称P是G 的一个路径覆盖.P 中路径可以从V 的任何一个顶点开始,长度也是任意的,特别 ...

  7. 洛谷P2764 最小路径覆盖问题(二分图)

    题意 给出一张有向无环图,求出用最少的路径覆盖整张图,要求路径在定点处不相交 输出方案 Sol 定理:路径覆盖 = 定点数 - 二分图最大匹配数 直接上匈牙利 输出方案的话就不断的从一个点跳匹配边 # ...

  8. 洛谷 [P2764]最小路径覆盖问题

    二分图应用模版 #include <iostream> #include <cstdio> #include <algorithm> #include <cs ...

  9. 洛谷-p2764(最小路径覆盖)(网络流24题)

    #include<iostream> #include<algorithm> #include<queue> #include<cstring> #in ...

随机推荐

  1. MiniProfiler工具介绍(监控EF生成的SQL语句)--EF,迷你监控器,哈哈哈

    十年河东,十年河西,莫欺少年穷... 今天是抄袭的别人的博客,不过我感觉蛮好,挺有用,特别是老板让你优化EF项目SQL耗时的情况下,你可以采用这种方式来优化你的LINQ. 时间很宝贵,废话还是不多说, ...

  2. Opencv 2.4.10 +VS2010 项目配置

    资料来源:http://blog.csdn.net/scottly1/article/details/40978625

  3. Verilog设计Valid-Ready握手协议

    转自http://ninghechuan.com 我不生产知识,我只是知识的搬运工. Handshake Protocol握手协议!为了保证数据传输过程中准确无误,我们需要加上握手信号来控制信号的传输 ...

  4. vue 中使用 async/await 将 axios 异步请求同步化处理

    1. axios 常规用法: export default { name: 'Historys', data() { return { totalData: 0, tableData: [] } }, ...

  5. Jmeter(三十)_TimeShift函数在JSR223中的使用

    今天学习一下TimeShift函数在JSR223中的使用方法. 关联之前的一篇时间戳文章:Jmeter(十二)_打印时间戳 首先,创建线程组,在线程组下面创建一个JSR223采样器 选择Groovy语 ...

  6. 自从硬派网倒闭后,就没有什么好看的IT硬件网站了

    RT

  7. Redis哨兵模式(sentinel)学习总结及部署记录(主从复制、读写分离、主从切换)

    Redis的集群方案大致有三种:1)redis cluster集群方案:2)master/slave主从方案:3)哨兵模式来进行主从替换以及故障恢复. 一.sentinel哨兵模式介绍Sentinel ...

  8. “北航学堂”M2阶段postmortem

    “北航学堂”M2阶段postmortem 设想和目标 1. 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 这个问题我们在M1阶段的时候就已经探讨的比较明确了,就是 ...

  9. M1事后分析汇报以及总结

    一.设想和目标 1. 们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 我们的软件主要是为了提供周边美食和菜谱查询功能,为“吃货”们提供便利.对典型用户和场景有清晰的描 ...

  10. Android之JSON格式数据解析

    查看原文:http://blog.csdn.net/hantangsongming/article/details/42234293 JSON:JavaScript 对象表示法(JavaScript ...