POJ -- 3469 Dual Core CPU (最大流,最小割)
2015-07-10 16:41
375 查看
题目大意:
双核计算机A,B,有n个模块,每个模块都要再CPU中运行,并且知道了每个模块在每个CPU上的运行时间,如果它们运行在同一个cpu,就可以忽略共享数据的花费,否则需要额外的费用,求完成所有任务的最小花费;
思路分析:
①:最大流量=最小割容量
②:建图:让两个CPU分别为图的源点s和汇点t,已知每个模块与两个CPU的运行时间Ai,Bi,则对于每个模块,从s连向一条容量为Ai的边到这个模块,在从这个模块连一条容量为Bi的边到t;对于在不同模块运行的模块需要额外的花费w,则在这两个模块之间连一条容量为w的双向边。
代码实现:
SAP:3172ms
双核计算机A,B,有n个模块,每个模块都要再CPU中运行,并且知道了每个模块在每个CPU上的运行时间,如果它们运行在同一个cpu,就可以忽略共享数据的花费,否则需要额外的费用,求完成所有任务的最小花费;
思路分析:
①:最大流量=最小割容量
②:建图:让两个CPU分别为图的源点s和汇点t,已知每个模块与两个CPU的运行时间Ai,Bi,则对于每个模块,从s连向一条容量为Ai的边到这个模块,在从这个模块连一条容量为Bi的边到t;对于在不同模块运行的模块需要额外的花费w,则在这两个模块之间连一条容量为w的双向边。
代码实现:
SAP:3172ms
#include<cstdio> #include<cstring> #include<iostream> #include<queue> using namespace std; const int N=20010; const int M=200010; const int INF=0x3f3f3f3f; int n,m,top,s,t,head ,dis ,pre ,gap ,cur ,low ; struct Edge{ int to,next,flow; }edge[N*4+M*4]; void Addedge(int from,int to,int val){ edge[top].to=to,edge[top].next=head[from],edge[top].flow=val,head[from]=top++; edge[top].to=from,edge[top].next=head[to],edge[top].flow=0,head[to]=top++; } void Bfs(){ queue<int> q; memset(gap,0,sizeof(gap)); memset(dis,-1,sizeof(dis)); gap[0]=1,dis[t]=0; q.push(t); while(!q.empty()){ int u=q.front(); q.pop(); for(int i=head[u];i+1;i=edge[i].next){ if(dis[edge[i].to]==-1){ dis[edge[i].to]=dis[u]+1; gap[dis[edge[i].to]]++; q.push(edge[i].to); } } } } int Sap(){ Bfs(); memset(pre,-1,sizeof(pre)); for(int i=0;i<=n+1;++i) cur[i]=head[i]; int u=s,i,cur_flow,max_flow=0,neck,tmp; while(dis[s]<n+1){ if(u==t){ cur_flow=INF; for(int i=s;i!=t;i=edge[cur[i]].to){ if(cur_flow>edge[cur[i]].flow){ neck=i; cur_flow=edge[cur[i]].flow; } } for(int i=s;i!=t;i=edge[cur[i]].to){ tmp=cur[i]; edge[tmp].flow-=cur_flow; edge[tmp^1].flow+=cur_flow; } max_flow+=cur_flow; u=neck; } int i; for(i=cur[u];i!=-1;i=edge[i].next) if(edge[i].flow&&dis[u]==dis[edge[i].to]+1) break; if(i!=-1){ cur[u]=i; pre[edge[i].to]=u; u=edge[i].to; }else{ if(--gap[dis[u]]==0) break; cur[u]=head[u]; int mindis=n; for(i=head[u];i!=-1;i=edge[i].next){ if(edge[i].flow&&mindis>dis[edge[i].to]) mindis=dis[edge[i].to]; } dis[u]=mindis+1; gap[dis[u]]++; if(u!=s) u=pre[u]; } } return max_flow; } int main(){ while(~scanf("%d%d",&n,&m)){ s=0,t=n+1; int v1,v2,x,y; memset(head,-1,sizeof(head)); top=0; for(int i=1;i<=n;++i){ scanf("%d%d",&v1,&v2); Addedge(s,i,v1); Addedge(i,t,v2); } for(int i=0;i<m;++i){ scanf("%d%d%d",&x,&y,&v1); Addedge(x,y,v1); Addedge(y,x,v1); } int res=Sap(); printf("%d\n",res); } }DINIC:6219ms
#include<cstdio> #include<cstring> #include<iostream> #include<queue> #define Min(a,b) ((a)<(b)?(a):(b)) using namespace std; const int N=20010; const int M=200010; const int INF=0x3f3f3f3f; int n,m,top,s,t,head ,dis ; struct Edge{ int to,next,flow; }edge[N*4+M*4]; void Addedge(int from,int to,int val){ edge[top].to=to,edge[top].next=head[from],edge[top].flow=val,head[from]=top++; edge[top].to=from,edge[top].next=head[to],edge[top].flow=0,head[to]=top++; } int Bfs(){ queue<int> q; memset(dis,-1,sizeof(dis)); dis[s]=0; q.push(s); while(!q.empty()){ int u=q.front(); q.pop(); if(u==t) return 1; for(int i=head[u];i+1;i=edge[i].next){ if(dis[edge[i].to]==-1&&edge[i].flow){ dis[edge[i].to]=dis[u]+1; q.push(edge[i].to); } } } return 0; } int Dinic(int u,int sum){ if(u==t) return sum; int max_flow=0; for(int i=head[u];i+1;i=edge[i].next){ if(dis[edge[i].to]==dis[u]+1&&edge[i].flow){ int a=Dinic(edge[i].to,Min(sum-max_flow,edge[i].flow)); edge[i].flow-=a; edge[i^1].flow+=a; max_flow+=a; if(max_flow==sum) return max_flow; } } if(!max_flow) dis[u]=-1; return max_flow; } int main(){ while(~scanf("%d%d",&n,&m)){ s=0,t=n+1; int v1,v2,x,y; memset(head,-1,sizeof(head)); top=0; for(int i=1;i<=n;++i){ scanf("%d%d",&v1,&v2); Addedge(s,i,v1); Addedge(i,t,v2); } for(int i=0;i<m;++i){ scanf("%d%d%d",&x,&y,&v1); Addedge(x,y,v1); Addedge(y,x,v1); } int res=0; while(Bfs()){ res+=Dinic(s,INF); } printf("%d\n",res); } }
相关文章推荐
- Binary Tree Inorder Traversal
- Windows Server 2012/win8 iis8 上安装 asp.net 4.5 当时用了mvc5 .net framework 4.5 所以得装下
- 微信公共平台消息回复类
- HashSet<T>类
- 【再思考】1010. Radix (25)
- android使用xml实现虚线效果
- 树上操作 解题报告
- 自动回复微信消息
- 【Java】汉诺塔问题
- CodeForces 555E Case of Computer Network
- SQL Server查看所有表大小,所占空间
- CocoaPods安装和使用教程-2
- Oracle学习(十八)之控制文件、日志文件、数据文件及配置文件管理总结
- C &&Linux 下简单实现单词统计
- 瞎子摸牌问题
- Linux中link,unlink,close,fclose详解
- 微软公布Win10预览版KMS客户端安装密钥 不可激活零售版
- ubuntu下配置jdk环境变量和安装tomcat7
- 微软公布Win10预览版KMS客户端安装密钥 不可激活零售版
- GRE写作必备句型