博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
vijos P1352 最大获利(最小割)
阅读量:6957 次
发布时间:2019-06-27

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

请不要随便指点别人该怎么做、每一个人的人生都应该自己掌握、你给不了别人一切、你也不懂别人的忧伤、

                                                                                          微笑不代表快乐、哭泣不一定悲伤

               不努力怎么让关心你的人幸福、不努力怎么让看不起你的人绝望、

                                                                                                                                    

                                                                                                                                                              我用生命在奋斗——lx_Zz

—————————————————————————————————————————————————————————————

—————————————————————————    华丽的切割线    ————————————————————————————

—————————————————————————————————————————————————————————————

敬仰完《最小割模型在信息学中的应用》论文之后切一下例题、发现自己太弱了。。

。orz

/* 题目: vijos 1352  *//* 作者: lx_Zz       *//* 时间: 2014.5.20   */#include
#include
#include
#include
using namespace std;#define N 60005#define INF 0x7fffffffint n,m,k;int level[N];struct node{ int to,next,cost;}edge[500005];int num[N];int head[N];int t_head[N];int start,end;void init(){ k=0; memset(head,-1,sizeof(head));}int bfs(int s,int t)//对顶点进行标号、找出层次图{ memset(level,0,sizeof(level)); queue
q; q.push(s); level[s]=1; while(!q.empty()) { int now=q.front(); q.pop(); for(int i=head[now];i!=-1;i=edge[i].next) { int y=edge[i].to; if(!level[y]&&edge[i].cost>0) { level[y]=level[now]+1; q.push(y); } } } return level[t]!=0;//汇点是否在层次图中}int dfs(int s,int cp)//在层次图中寻找增广路进行增广{ int flow=0,temp; int t; if(s==end||cp==0)return cp; for(;t_head[s]+1;t_head[s]=edge[t_head[s]].next) { int y=edge[t_head[s]].to; if(level[s]+1==level[y]) { temp=dfs(y,min(cp,edge[t_head[s]].cost)); if(temp>0) { edge[t_head[s]].cost-=temp; edge[t_head[s]^1].cost+=temp; flow+=temp; cp-=temp; if(cp==0)break; } } } return flow;}int dinic(){ int ans=0,flow=0; while(bfs(start,end))//汇点不在层次图中、算法终止 { for(int i=0;i<=end;i++) t_head[i]=head[i]; ans+=dfs(start,INF); } return ans;}void add(int x,int y,int val){ edge[k].to=y; edge[k].cost=val; edge[k].next=head[x]; head[x]=k++; edge[k].to=x; edge[k].cost=0; edge[k].next=head[y]; head[y]=k++;}int main(){ //freopen("C:\\Users\\终将我要华丽的逆袭\\Desktop\\lx_Zz_in.txt","r",stdin); //freopen("C:\\Users\\终将我要华丽的逆袭\\Desktop\\lx_Zz_out.txt","w",stdout); int n,m; scanf("%d%d",&n,&m); init(); int x; start=0;end=n+m+1; for(int i=1;i<=n;i++) { scanf("%d",&x); add(start,i,x); } int sum=0; for(int i=1;i<=m;i++) { int a,b,c; scanf("%d%d%d",&a,&b,&c); add(a,n+i,INF); add(b,n+i,INF); add(n+i,end,c); sum+=c; } int ans=dinic(); printf("%d\n",sum-ans); return 0;}
非递归更高效的

/* 题目: vijos 1352  *//* 作者: lx_Zz       *//* 时间: 2014.5.20   */#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;const int INF=0x7ffffff;const int MAXN=60005;//点数的最大值const int MAXM=500005;//边数的最大值struct Node{ int from,to,next; int cap;}edge[MAXM];int tol;int dep[MAXN];//dep为点的层次int head[MAXN];int n;void init(){ tol=0; memset(head,-1,sizeof(head));}void add(int u,int v,int w)//第一条变下标必须为偶数{ edge[tol].from=u; edge[tol].to=v; edge[tol].cap=w; edge[tol].next=head[u]; head[u]=tol++; edge[tol].from=v; edge[tol].to=u; edge[tol].cap=0; edge[tol].next=head[v]; head[v]=tol++;}int BFS(int start,int end){ int que[MAXN]; int front,rear; front=rear=0; memset(dep,-1,sizeof(dep)); que[rear++]=start; dep[start]=0; while(front!=rear) { int u=que[front++]; if(front==MAXN)front=0; for(int i=head[u];i!=-1;i=edge[i].next) { int v=edge[i].to; if(edge[i].cap>0&&dep[v]==-1) { dep[v]=dep[u]+1; que[rear++]=v; if(rear>=MAXN)rear=0; if(v==end)return 1; } } } return 0;}int dinic(int start,int end){ int res=0; int top; int stack[MAXN];//stack为栈,存储当前增广路 int cur[MAXN];//存储当前点的后继 while(BFS(start,end)) { memcpy(cur,head,sizeof(head)); int u=start; top=0; while(1) { if(u==end) { int min=INF; int loc; for(int i=0;i
edge[stack[i]].cap) { min=edge[stack[i]].cap; loc=i; } for(int i=0;i

转载地址:http://kzmil.baihongyu.com/

你可能感兴趣的文章
WPF界面设计技巧(4)—自定义列表项样式
查看>>
git push的时候每次都要输入用户名和密码的问题解决
查看>>
精益开发实战:用看板管理大型项目
查看>>
hiho_1138_island_travel
查看>>
Redis内存存储结构分析
查看>>
love2d教程13--图形界面
查看>>
POJ 1276 Cash Machine
查看>>
C语言中 struct成员变量顺序对内存的占用
查看>>
POJ1291-并查集/dfs
查看>>
移动办公首选!电商热卖轻薄本高低该怎么选?
查看>>
[译] RNN 循环神经网络系列 1:基本 RNN 与 CHAR-RNN
查看>>
Android技能树 — PopupWindow小结
查看>>
如何在create-react-app项目中使用vw实现手淘vw移动端适配布局
查看>>
Wormhole燃烧地址到底有多安全
查看>>
Web探索之旅 | 第三部分第三课:协议
查看>>
20个优秀手机界面扁平化设计,让你一秒看懂扁平化
查看>>
从百度的PPT文化看程序员晋升
查看>>
Python测试登录功能
查看>>
mysql 创建高性能索引
查看>>
babel插件入门-AST(抽象语法树)
查看>>