poj 2125 【最小割】
2016-05-10 19:30
288 查看
题目大意:一个有向无环图,删除一个点的全部入边代价为 aia_i,删除一个点的全部出边代价为 bib_i,求删除所有边的最小代价
将一个点 i 拆成两个点 i,i’
建图:
S -> i,流量 bib_i
i -> j’,流量 infinf
i’ -> T,流量 aia_i
然后跑最小割QAQ
如果是表格,也可以拆成行列像这样做…
如果要求以次数最小为前提,可以在权值前面加上一个很大的数…
将一个点 i 拆成两个点 i,i’
建图:
S -> i,流量 bib_i
i -> j’,流量 infinf
i’ -> T,流量 aia_i
然后跑最小割QAQ
如果是表格,也可以拆成行列像这样做…
如果要求以次数最小为前提,可以在权值前面加上一个很大的数…
#include<iostream> #include<algorithm> #include<cstring> #include<string> #include<ctime> #include<cmath> #include<cstdlib> #include<cstdio> #define N 2005 #define M 50005 #define INF 1000000000 using namespace std; int n,m,siz=1,S,T; int first ,next[M],to[M],len[M]; int d ,p ,c ,r ,v ; void inser(int x,int y,int w) { next[++siz]=first[x]; first[x]=siz; to[siz]=y; len[siz]=w; } void add_edge(int x,int y,int w) { inser(x,y,w),inser(y,x,0); } bool bfs() { int head=0,tail=1; memset(d,0,sizeof(d)); d[p[1]=S]=1; while (head^tail) { int x=p[++head]; for (int i=first[x];i;i=next[i]) if (!d[to[i]]&&len[i]) d[p[++tail]=to[i]]=d[x]+1; } return d[T]; } int dfs(int x,int flow) { if (x==T) return flow; int ret=0; for (int i=first[x];i&&flow;i=next[i]) if (d[to[i]]==d[x]+1&&len[i]) { int w=dfs(to[i],min(flow,len[i])); len[i]-=w; len[i^1]+=w; ret+=w; flow-=w; } if (!ret) d[x]=0; return ret; } int dinic() { int ret=0; while (bfs()) ret+=dfs(S,INF); return ret; } void DFS(int x) { v[x]=true; for (int i=first[x];i;i=next[i]) if (!v[to[i]]&&len[i]) DFS(to[i]); } int main() { scanf("%d%d",&n,&m); S=n<<1|1,T=S+1; for (int x,i=1;i<=n;i++) scanf("%d",&x),add_edge(i+n,T,x); for (int x,i=1;i<=n;i++) scanf("%d",&x),add_edge(S,i,x); for (int x,y,i=1;i<=m;i++) { scanf("%d%d",&x,&y); add_edge(x,y+n,INF); } printf("%d\n",dinic()); int tot=0; DFS(S); for (int i=1;i<=n;i++) { if (!v[i]) r[i]=1,tot++; if (v[i+n]) c[i]=1,tot++; } printf("%d\n",tot); for (int i=1;i<=n;i++) { if (r[i]) printf("%d -\n",i); if (c[i]) printf("%d +\n",i); } return 0; }
相关文章推荐
- linux之CentOS将普通的命令加入环境变量
- 关于jvm的OutOfMemory:PermGen space异常的解决
- 断案
- 金牌、银牌、铜牌
- HighCharts之图表背景设置
- [bzoj4551][TJOI&HEOI2016]树
- NYOJ - 168 房间安排
- HDU 1392.Surround the Trees【凸包(求凸包周长)】【5月10】
- 笔试题51. LeetCode OJ (38)
- C++实验5—求和
- shell浅谈之二运算符和IF条件判断
- POJ 3087 Shuffle'm Up
- [Python] RiceRocks游戏 Mini-project #8
- Spark SQL和DataFrame的学习总结
- [读书笔记]Clean Code (8-完结)
- Java--类的继承--回合制对战游戏
- java中如何自定义线程
- java中static{}语句块详解
- RabbitMq、ActiveMq、ZeroMq、kafka之间的比较,资料汇总
- Android 内功心法(1.4)——android常用设计模式之代理模式