传送门

好久没做网络流方面的题发现自己啥都不会了qwq

题意:给一张有向图,让你用最少的简单路径覆盖所有的点。

考虑这样一个东西,刚开始,我们有\(n\)条路径,每条路径就是单一的一个点,那么我们的目的就是进行若干次操作将路径两两合并,这样对于一个以节点\(x\),它作为路径的端点最多被合并两次(一次连出边一次连入边)。

于是考虑二分图,将点\(x\)炸成两个点\(x_0,x_1\),\(x_0\)表示\(x\)连出去的出边,\(x_1\)表示\(x\)连进来的入边。那么对于图上一条\(u \rightarrow v\)的路径,在\(u_0,v_1\)之间连一条边,表示合并一条\(u\)为端点的路径和一条\(v\)为端点的路径。

这样,在合法的情况下最大的合并次数就是这张二分图的最大匹配数。

最小的路径条数就是\(n-\)最大匹配。匈牙利或者网络流啥的求出最大匹配,然后打印方案的话就对整张图照着最大匹配中的边\(Dfs\)一遍。

网络流的代码 还是感觉匈牙利好写......:

#include <bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for (int i=(a);i<(b);++i)
#define per(i,a,b) for (int i=(a)-1;i>=(b);--i)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define all(x) (x).begin(),(x).end()
#define SZ(x) ((int)(x).size())
typedef double db;
typedef long long ll;
typedef pair<int,int> PII;
typedef vector<int> VI; const int N=1e5+10,INF=0x3f3f3f3f; struct Dinic {
int n,S,T;
int to[N<<1],nxt[N<<1],fst[N],cap[N<<1],flow[N<<1],cnt=0; inline void ade(int x,int y,int w) {
to[++cnt]=y,cap[cnt]=w,flow[cnt]=0;
nxt[cnt]=fst[x],fst[x]=cnt;
}
inline void addedge(int x,int y,int w) {ade(x,y,w),ade(y,x,0);} int d[N],q[N];
bool bfs() {
rep(i,0,n+1) d[i]=0;
int tn=1; q[0]=S;
d[S]=1;
rep(_,0,tn) {
int u=q[_];
for(int i=fst[u];i;i=nxt[i]) {
int v=to[i];
if(d[v]==0&&cap[i]>flow[i]) {
d[v]=d[u]+1;
q[tn++]=v;
}
}
}
return d[T]!=0;
} int cur[N];
int dfs(int x,int ag) {
if(x==T||ag==0) return ag;
for(int &i=cur[x];i;i=nxt[i]) {
int v=to[i];
if(cap[i]>flow[i]&&d[v]==d[x]+1) {
int out=dfs(v,min(ag,cap[i]-flow[i]));
if(out) {
flow[i]+=out;
flow[i^1]-=out;
return out;
}
else d[v]=0;
}
}
return 0;
} int Maxflow() {
int ans=0,out=0;
while(bfs()) {
rep(i,0,n+1) cur[i]=fst[i];
while(out=dfs(S,1e9)) ans+=out;
}
return ans;
} void init(int tn,int s,int t) {
S=s,T=t,n=tn;
rep(i,0,n+1) fst[i]=0;
cnt=1;
}
}flow; #define IDL(x) (x)
#define IDR(x) ((x)+n)
#define NODE(x) ((x)<=n?(x):(x)-n)
int n,m;
int vis[233][233],mark[N];
VI g[N]; void dfs(int x) {
printf("%d ",x);
mark[x]=1;
for(auto v:g[x]) if(vis[x][v])
dfs(v);
} int main() {
scanf("%d%d",&n,&m);
const int S=n*2+1,T=n*2+2;
flow.init(n*2+5,S,T);
rep(i,1,n+1) flow.addedge(S,IDL(i),1),flow.addedge(IDR(i),T,1);
rep(i,0,m) {
int x,y; scanf("%d%d",&x,&y);
flow.addedge(IDL(x),IDR(y),INF);
g[x].pb(y);
}
int ans=n-flow.Maxflow();
rep(i,2,flow.cnt+1) if(flow.flow[i]==1)
vis[NODE(flow.to[i^1])][NODE(flow.to[i])]=1;
rep(i,1,n) if(!mark[i]) dfs(i),puts("");
printf("%d\n",ans);
return 0;
}

[题解] LuoguP2764 最小路径覆盖问题的更多相关文章

  1. LuoguP2764 最小路径覆盖问题(最大流)

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

  2. [luoguP2764] 最小路径覆盖问题(最大流 || 二分图最大匹配)

    传送门 可惜洛谷上没有special judge,不然用匈牙利也可以过的,因为匈牙利在增广上有一个顺序问题,所以没有special judge就过不了了. 好在这个题的测试数据比较特殊,如果是网络流的 ...

  3. poj2594 机器人寻找宝藏(最小路径覆盖)

    题目来源:http://poj.org/problem?id=2594 参考博客:http://www.cnblogs.com/ka200812/archive/2011/07/31/2122641. ...

  4. UVALive3126 Taxi Cab Scheme —— 最小路径覆盖

    题目链接:https://vjudge.net/problem/UVALive-3126 题解: 最小路径覆盖:即在图中找出尽量少的路径,使得每个结点恰好只存在于一条路径上.其中单独一个点也可以是一条 ...

  5. UVALive - 7368 Airports DAG图的最小路径覆盖

    题目链接: http://acm.hust.edu.cn/vjudge/problem/356788 Airports Time Limit: 3000MS 问题描述 An airline compa ...

  6. poj 2060 Taxi Cab Scheme (最小路径覆盖)

    http://poj.org/problem?id=2060 Taxi Cab Scheme Time Limit: 1000MS   Memory Limit: 30000K Total Submi ...

  7. hdoj 3861 The King’s Problem【强连通缩点建图&&最小路径覆盖】

    The King’s Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  8. POJ1422 Air Raid 【DAG最小路径覆盖】

    Air Raid Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6763   Accepted: 4034 Descript ...

  9. 【PowerOJ1738】最小路径覆盖

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

随机推荐

  1. Struts2学习(四)

    struts-defualt.xml指定的result的类型 1.struts-defualt.xml 文件的 181 行 开始定义了: <result-types> <result ...

  2. 墨西哥萨卡特卡斯将举行GNOME GUADEC 2020 峰会

    导读 GNOME基金会今天宣布了下两届GUADEC(GNOME用户和开发人员欧洲会议)活动的主办城市,这也将是GNOME桌面环境下一版本的代号. 随着GNOME 3.34 “Thessalonik”的 ...

  3. WebMagic基础与Maven管理依赖

    2. 快速开始 WebMagic主要包含两个jar包:webmagic-core-{version}.jar和webmagic-extension-{version}.jar.在项目中添加这两个包的依 ...

  4. Hibernate(九)--N+1问题

    1.在利用Hibernate操作数据库的时候,如果在实体类上设置了表的双向关联.这可能会出现Hibernate N+1的问题. 1.1.一对多: 在一方,查找得到了 n 个对象,那么又需要将 n 个对 ...

  5. 笔记||Pyhthon3进阶之多线程操作共享数据

    # 多线程操作共享数据--------------------------------------------------------------- # import threading# 使用锁# ...

  6. pip3与pyttsx3文字语音转换

    今天想做个语音读取的小脚本,在网上查了一下发现python里有个pyttsx可以识别文字, 打算通过pip3 install pyttsx安装包,结果报错, 然后试了一下发现不行,去网上查了一下发现p ...

  7. 吴裕雄--天生自然HADOOP操作实验学习笔记:pig简介

    实验目的 了解pig的该概念和原理 了解pig的思想和用途 了解pig与hadoop的关系 实验原理 1.Pig 相比Java的MapReduce API,Pig为大型数据集的处理提供了更高层次的抽象 ...

  8. Android 隐藏手机号中间四位和隐藏邮箱地址中间四位

    /** * 手机号用****号隐藏中间数字 * * @param phone * @return */public static String settingphone(String phone) { ...

  9. 三、java基础-方法含义_重载_递归

    1.java中方法: 方法的含义: 就是一个代码片段,可以完后某个特定的功能,可以重复利用: 定义方法的语法: [方法的修饰符列表]   方法的返回值类型   方法名{    java语句; } 注意 ...

  10. bootstrap选项卡页面中如何关闭当前选项卡及页面

    再具体说一下现在的需求: 如上界面:在新闻发布界面有一个按钮,在点击按钮的时候我需要直接把这个打开的选项卡关闭 实现思路: 1)关闭选项卡对应的页面     2)去除上方选项卡      3)激活前一 ...