HDU -- 4280 Island Transport(最大流)
2015-07-10 16:46
393 查看
题目大意:
n个岛屿,m个无向路径,问从最西边的岛屿到最东边的岛屿的最多能运送多少乘客;
代码实现:
n个岛屿,m个无向路径,问从最西边的岛屿到最东边的岛屿的最多能运送多少乘客;
代码实现:
#include<cstdio> #include<cstring> #include<iostream> #include<queue> #pragma comment(linker, "/STACK:1024000000,1024000000") #define Min(a,b) ((a)<(b)?(a):(b)) #define Max(a,b) ((a)>(b)?(a):(b)) using namespace std; const int N=100010; const int INF=0x3f3f3f3f; int head ,dis ,pre ,gap ,cur ,low ,s,t,n,m,top; struct Edge{ int to,flow,next; }edge[N*4]; void Addedge(int from,int to,int val){ edge[top].to=to,edge[top].flow=val,edge[top].next=head[from],head[from]=top++; edge[top].to=from,edge[top].flow=0,edge[top].next=head[to],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&&edge[i].flow){ 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=1;i<=n;++i) cur[i]=head[i]; int u=s,i,cur_flow,max_flow=0,neck,tmp; while(dis[s]<n){ 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(){ int T; scanf("%d",&T); while(T--){ int u,v,val,x,y; memset(head,-1,sizeof(head)); top=0; scanf("%d%d",&n,&m); int ss=INF,tt=0; for(int i=1;i<=n;++i){ scanf("%d%d",&x,&y); if(ss>x) ss=x,s=i; if(tt<x) tt=x,t=i; } for(int i=0;i<m;++i){ scanf("%d%d%d",&u,&v,&val); Addedge(u,v,val); Addedge(v,u,val); } int res=0; res=Sap(); printf("%d\n",res); } }
相关文章推荐
- 浅谈sql中的in与not in,exists与not exists的区别
- 避免内存泄露的方法
- Permutation Sequence
- 关于安卓sdk的下载
- 【算法学习笔记】70.回文序列 动态规划 SJTU OJ 1066 小M家的牛们
- GRE写作必备句型
- Windows内存诊断是怎么?怎么用?
- PHPStrom 快捷键整理
- Google浏览器中的开发工具.
- 低功耗蓝牙BLE
- Mac技巧之让U盘、移动硬盘在苹果电脑和Windows PC都能识别/读写,且支持4GB大文件:exFAT格式
- 前端开发注意事项
- 全志A20 DIY
- 内存泄漏以及常见的解决方法
- Light OJ 1110 - An Easy LCS (LCS+字典序最小路径记录)
- 如果Cell设置了 titlelabel Titlelabel会覆盖加在cell上面的其他控件
- kvm+libvirt虚拟机快照浅析
- poj 迷宫问题(简单题)
- Android Design Support Library 的 代码实验——几行代码,让你的 APP 变得花俏
- 字符串生成UUID