博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【网络流专题4】 最小点权覆盖集
阅读量:5226 次
发布时间:2019-06-14

本文共 1952 字,大约阅读时间需要 6 分钟。

Ahead

11.1.2018

例题

poj 2125

题意为选取一些点使得覆盖所有的边

仍然是最小割与割点,对于每一条边的两个点,从源点向每个点连一条删除从这个点出发的所有边的权值 即W- ,同理对每一个点向汇点连W+ 中间部分为图的边关系。
然后最大流即可
针对方案需要进行一次深搜,对于与源点连接的点,如果不能被访问到,那么一定是割去的,对于与汇点相连的如果被访问到那么一定是割去的

代码

#include 
#include
#include
#include
#include
using namespace std;const int s = 1000,t = 1001;const int N = 40000,inf = 0x3f3f3f3f;int n,m;int to[N<<1],nxt[N<<1],last[N],w[N<<1],len=1;inline void ins(int x,int y,int c){ to[++len]=y,nxt[len]=last[x],w[len]=c,last[x]=len;}int h[N];bool vis[N];bool bfs(){ memset(h,0,sizeof(h)); queue
q; vis[s]=1; q.push(s); h[s]=1; while(!q.empty()) { int x = q.front(); q.pop(); vis[x]=0; for(int k=last[x]; k; k=nxt[k]) { int y=to[k]; if(w[k] && !h[y]) { h[y] = h[x] + 1 ; if(!vis[y]) { vis[y]=1; q.push(y); } } } } return h[t]!=0;}int dfs(int x,int flow){ if(x==t) return flow; int res=flow; for(int k=last[x]; k; k=nxt[k]) { int y=to[k]; if(w[k] && h[y] == h[x]+1) { int t = dfs(y,min(w[k],res)); w[k]-=t; w[k^1]+=t; res-=t; if(res==0) break; } } if(res==flow) h[x]=0; return flow-res;}inline int dinic(){ int maxflow=0; while(bfs()) { int tmp = dfs(s,inf); while(tmp) { maxflow += tmp; tmp = dfs(s,inf); } } return maxflow;}bool ok[N];void DFS(int x){ ok[x]=1; for(int k=last[x]; k; k=nxt[k]) { int y=to[k]; if(!ok[y] && w[k]) DFS(y); }}int main(){ int x,y,z; scanf("%d%d",&n,&m); for(int i=1; i<=n; ++i) { scanf("%d",&z); ins(i+n,t,z),ins(t,i+n,0); } for(int i=1; i<=n; ++i) { scanf("%d",&z); ins(s,i,z),ins(i,s,0); } for(int i=1; i<=m; ++i) { scanf("%d%d",&x,&y); ins(x,y+n,inf),ins(y+n,x,0); } printf("%d\n",dinic()); int res=0; DFS(s); for(int i = 1; i <= n; i++) { if(!ok[i]) res++; if(ok[i + n]) res++; } printf("%d\n", res); for(int i = 1; i <= n; i++) { if(!ok[i]) printf("%d -\n", i); if(ok[i+n]) printf("%d +\n", i); } return 0;}

转载于:https://www.cnblogs.com/PiCaHor/p/9889978.html

你可能感兴趣的文章
马达调速器,直流马达调速器,直流调速器
查看>>
前端编码规范小记
查看>>
c如何弹出保存路径/保存文件对话框
查看>>
HTML标签二
查看>>
Python 3语法小记(九) 异常 Exception
查看>>
使用shared memory 计算矩阵乘法 (其实并没有加速多少)
查看>>
Django 相关
查看>>
git init
查看>>
训练记录
查看>>
IList和DataSet性能差别 转自 http://blog.csdn.net/ilovemsdn/article/details/2954335
查看>>
Hive教程(1)
查看>>
第16周总结
查看>>
C#编程时应注意的性能处理
查看>>
Fragment
查看>>
比较安全的获取站点更目录
查看>>
苹果开发者账号那些事儿(二)
查看>>
python使用chardet判断字符串编码,超简单的代码
查看>>
[NOIP2012TG] 洛谷 P1080 国王游戏
查看>>
使用C#交互快速生成代码!
查看>>
洛谷P4315 月下“毛景树” 边权树剖+双标记
查看>>