poj 2135最小费用最大流
2015-08-18 20:27
267 查看
最小费用最大流就是在增广的时候选择最短路(用费用作为边权)来增广,一直增广到没得增广就是我们要求得结果。
例题:poj2135.
题意:求从点1到N再到1共两条不相交的最短路,边流量为1,再加一个源和汇,分别与1和N相连,权为0,流量为2。
例题:poj2135.
题意:求从点1到N再到1共两条不相交的最短路,边流量为1,再加一个源和汇,分别与1和N相连,权为0,流量为2。
#include<stdio.h> #include<string.h> #include<vector> #include<queue> using namespace std; #define max(x,y) x>y?x:y #define min(x,y) x<y?x:y const int N=1100,INF=0x3f3f3f3f; int pre ,d ,p ,cnt,ans; struct edge { int u,v,w,c; }e[N*N]; vector<int> g ; void add(int u,int v,int w,int c) { e[cnt].u=u,e[cnt].v=v,e[cnt].w=w,e[cnt].c=c; g[u].push_back(cnt++); e[cnt].u=v,e[cnt].v=u,e[cnt].w=-w,e[cnt].c=0; g[v].push_back(cnt++); } void updata(int s,int t) { int i,f=INF; for(i=t;i!=s;i=e[pre[i]].u) f=min(f,e[pre[i]].c); for(i=t;i!=s;i=e[pre[i]].u) { e[pre[i]].c-=f; e[pre[i]^1].c+=f; ans+=f*e[pre[i]].w; } } int spfa(int s,int t) { int i,u,v,w; memset(p,0,sizeof(p)); memset(pre,-1,sizeof(pre)); for(i=0;i<N;i++) d[i]=INF; queue<int> q; q.push(s),p[s]=1,d[s]=0; while(!q.empty()) { p[u=q.front()]=0; q.pop(); for(i=0;i<g[u].size();i++) { v=e[g[u][i]].v,w=e[g[u][i]].w; if(e[g[u][i]].c&&d[v]>d[u]+w) { d[v]=d[u]+w; pre[v]=g[u][i]; if(!p[v]) { p[v]=1; q.push(v); } } } } if(pre[t]==-1) return 0; return 1; } int main() { int i,n,m,u,v,w; while(scanf("%d%d",&n,&m)!=EOF) { for(i=0;i<N;i++) g[i].clear(); ans=cnt=0; for(i=1;i<=m;i++) { scanf("%d%d%d",&u,&v,&w); add(u,v,w,1); add(v,u,w,1); } add(0,1,0,2); add(n,n+1,0,2); while(spfa(0,n+1)) updata(0,n+1); printf("%d\n",ans); } return 0; }
相关文章推荐
- DOM——JavaScript高级程序设计笔记(8)
- 织梦 channel 标签 指定typeid时 currentstyle无效的修复办法
- 神奇的table-cell
- 面试常见问题分析
- 源代码解读Cas实现单点登出(single sign out)功能实现原理
- nginx学习笔记
- IOS学习笔记08-创建图片浏览程序
- hdu5399 Too simple
- JS的继承
- 2015/8/18/Activity框图/Linear与RelativeLayout布局
- MD5加密(Java)
- 如何动笔写你的第一篇论文
- uva216 Getting in Line
- 黑马程序员——IO(缓冲区、字节流、转换流、流操作规律)
- sqlite 数据库操作 创建数据库
- WPF中StaticResource 标记扩展和DynamicResource 标记扩展
- hdu5400(计数)
- iOS使用自定义字体,比如楷体
- iOS 支付宝 集成
- linux下socket网络通信详解