题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4280

题意:有n个岛屿,m条无向路,每个路给出最大允许的客流量,求从最西的那个岛屿最多能运用多少乘客到最东的那个岛屿

题解:最大流的裸题。输入记得找到最西和最东的岛屿,以及注意是双向边。。这题用的sap.

代码:

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<string>
#include<queue>
#include<algorithm>
using namespace std; const int N=;
const int M=;
const int inf=0xfffffff; int n,m,cnt; struct Edge{
int v , cap , next;
} edge[M]; int head[N],pre[N],d[N],numd[N];
int cur_edge[N]; void addedge(int u,int v,int c){
edge[cnt].v = v;
edge[cnt].cap = c;
edge[cnt].next = head[u];
head[u] = cnt++; edge[cnt].v = u;
edge[cnt].cap = ;
edge[cnt].next = head[v];
head[v] = cnt++;
} void bfs(int s){
memset(numd,,sizeof(numd));
for(int i=; i<=n; i++) numd[ d[i] = n ]++;
d[s] = ;
numd[n]--;
numd[]++;
queue<int> Q;
Q.push(s); while(!Q.empty()){
int v=Q.front();
Q.pop(); int i=head[v];
while(i != -){
int u=edge[i].v; if(d[u]<n){
i=edge[i].next;
continue ;
} d[u] = d[v]+;
numd[n]--;
numd[d[u]]++;
Q.push(u);
i=edge[i].next;
}
}
} int SAP(int s,int t){
for(int i = ; i <= n; i++) cur_edge[i] = head[i];
int max_flow = ;
bfs(t);
int u = s ;
while(d[s] < n){
if(u == t){
int cur_flow = inf,neck;
for(int from = s; from != t; from = edge[cur_edge[from]].v){
if(cur_flow > edge[cur_edge[from]].cap){
neck = from;
cur_flow = edge[cur_edge[from]].cap;
}
} for(int from = s; from != t; from = edge[cur_edge[from]].v){ //修改增广路上的边的容量
int tmp = cur_edge[from];
edge[tmp].cap -= cur_flow;
edge[tmp^].cap += cur_flow;
}
max_flow += cur_flow;
u = neck;
} int i;
for(i = cur_edge[u]; i != -; i = edge[i].next)
if(edge[i].cap && d[u] == d[edge[i].v]+)
break; if(i != -){
cur_edge[u] = i;
pre[edge[i].v] = u;
u = edge[i].v;
}
else{
numd[d[u]]--;
if(!numd[d[u]]) break;
cur_edge[u] = head[u];
int tmp = n;
for(int j = head[u]; j != -; j = edge[j].next)
if(edge[j].cap && tmp > d[edge[j].v])
tmp = d[edge[j].v]; d[u] = tmp+;
numd[d[u]]++;
if(u != s)
u = pre[u];
}
}
return max_flow;
} inline void pre_init(){
cnt = ;
memset(head, -, sizeof head);
} void mapping(){
int u, v, w;
for(int i = ; i <= m; ++i){
scanf("%d %d %d", &u, &v, &w);
addedge(u, v, w);
addedge(v, u, w);
}
} int main(){ int tcase;
scanf("%d",&tcase);
while(tcase--){
scanf("%d%d",&n,&m);
int x,y,s,t;
int minn = inf, maxx = -inf;
for(int i = ; i <= n; i++){
scanf("%d%d",&x,&y);
if(x <= minn){
s = i;
minn = x;
}
if(x >= maxx){
t = i;
maxx = x;
}
}
pre_init();
mapping();
int ans = SAP(s,t);
printf("%d\n",ans);
}
return ;
}

最新文章

  1. js学习笔记5----函数传参
  2. hdu 4002 欧拉函数 2011大连赛区网络赛B
  3. byte[] 与字符串转换
  4. 【转】RESTful Web Services初探
  5. [转] js prototype详解
  6. 原生javascript效果:无缝滚动
  7. 性能指标--并发用户数(Concurrent Users)
  8. C#读取Excel的其中一种方式OleDb读取(100万条)--快速大量插入SQL中
  9. sparksql工程小记
  10. postgresql:terminate hung query
  11. python有序字典
  12. mq命令帮助文档
  13. 题解——loj6277 数列分块入门1(分块)
  14. Python2.7-functools
  15. BZOJ 4242 水壶(BFS建图+最小生成树+树上倍增)
  16. 在Linux中以普通用户开机自动运行脚本程序
  17. Android开发中Chronometer的用法
  18. RUP---统一软件开发过程
  19. windows下的IO模型之完成端口
  20. webpack Error: Cannot find module &#39;webpack/lib/Chunk&#39; Extract-text-webpack-plugin 分离CSS

热门文章

  1. Python常用模块系列
  2. 301重定向将不带www的域名跳转到www的域名,403 Forbidden You don’t have permission to access the URL on this server
  3. 使用Pandas读取大型Excel文件
  4. python 根据字典的键值进行排序
  5. 27-python基础-python3-异常处理(try except)
  6. TurtleBOT3
  7. 7、服务发现&amp;服务消费者Ribbon
  8. css页面网址
  9. ssh-keyscan - 收集 ssh 公钥
  10. Nginx---系统学习