POJ 3228Gold Transportation(二分+最大流)
题目地址:POJ3288
这个题跟之前的一道题混了,感觉是一样的,所以连想都没怎么想就拆点然后求最短路然后二分求最大流了。结果连例子都只是,还一直以为又是哪里手残了。。结果看了看例子,手算也确实不正确,,。后来就没拆点,直接在原点上建的图,结果例子就过了。。然后提交1次AC。。。
后来细致的想了想,这题是问每一段路的最短的,而不是整个的最短的。所以说不应该拆点。而我混的那道题(poj2391)是问的走完的总的最小值。
这题的建图就是建一源点与汇点,将每一个金矿与源点相连,权值为金矿数,与汇点也相连,权值为仓库容量。然后二分最大距离,小于二分到的距离的连边。最后推断是否满流。
代码例如以下:
- #include <iostream>
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <math.h>
- #include <ctype.h>
- #include <queue>
- #include <map>
- #include <algorithm>
- using namespace std;
- const int INF=1e9;
- int head[500], s, t, nv, cnt, sum;
- int num[500], d[500], pre[500], cur[500], q[500], g1[500], g2[500], mp[210][210];
- struct node
- {
- int u, v, cap, next;
- }edge[1000000];
- void add(int u, int v, int cap)
- {
- edge[cnt].v=v;
- edge[cnt].cap=cap;
- edge[cnt].next=head[u];
- head[u]=cnt++;
- edge[cnt].v=u;
- edge[cnt].cap=cap;
- edge[cnt].next=head[v];
- head[v]=cnt++;
- }
- void bfs()
- {
- memset(d,-1,sizeof(d));
- memset(num,0,sizeof(num));
- int f1=0, f2=0, i;
- q[f1++]=t;
- num[0]=1;
- d[t]=0;
- while(f1>=f2)
- {
- int u=q[f2++];
- for(i=head[u];i!=-1;i=edge[i].next)
- {
- int v=edge[i].v;
- if(d[v]==-1)
- {
- d[v]=d[u]+1;
- num[d[v]]++;
- q[f1++]=v;
- }
- }
- }
- }
- int isap()
- {
- memcpy(cur,head,sizeof(cur));
- int flow=0, u=pre[s]=s, i;
- bfs();
- while(d[s]<nv)
- {
- if(u==t)
- {
- int f=INF, pos;
- for(i=s;i!=t;i=edge[cur[i]].v)
- {
- if(f>edge[cur[i]].cap)
- {
- f=edge[cur[i]].cap;
- pos=i;
- }
- }
- for(i=s;i!=t;i=edge[cur[i]].v)
- {
- edge[cur[i]].cap-=f;
- edge[cur[i]^1].cap+=f;
- }
- flow+=f;
- if(flow>=sum)
- return flow;
- u=pos;
- }
- for(i=cur[u];i!=-1;i=edge[i].next)
- {
- if(d[edge[i].v]+1==d[u]&&edge[i].cap)
- {
- break;
- }
- }
- if(i!=-1)
- {
- cur[u]=i;
- pre[edge[i].v]=u;
- u=edge[i].v;
- }
- else
- {
- if(--num[d[u]]==0) break;
- int mind=nv;
- for(i=head[u];i!=-1;i=edge[i].next)
- {
- if(mind>d[edge[i].v]&&edge[i].cap)
- {
- mind=d[edge[i].v];
- cur[u]=i;
- }
- }
- d[u]=mind+1;
- num[d[u]]++;
- u=pre[u];
- }
- }
- return flow;
- }
- int main()
- {
- int n, m, a, b, c, i, j, x, y;
- while(scanf("%d",&n)!=EOF&&n)
- {
- sum=0;
- y=0;
- for(i=1;i<=n;i++)
- {
- scanf("%d",&g1[i]);
- sum+=g1[i];
- }
- for(i=1;i<=n;i++)
- {
- scanf("%d",&g2[i]);
- y+=g2[i];
- }
- scanf("%d",&m);
- memset(mp,9999999,sizeof(mp));
- while(m--)
- {
- scanf("%d%d%d",&a,&b,&c);
- if(mp[a][b]>c)
- mp[a][b]=mp[b][a]=c;
- }
- /*for(i=1;i<=n;i++)
- {
- for(j=1;j<=n;j++)
- {
- printf("%d ",mp[i][j]);
- }
- printf("\n");
- }*/
- if(y<sum)
- {
- printf("No Solution\n");
- continue ;
- }
- int high=2000000, mid, low=1, ans=-1;
- while(low<=high)
- {
- mid=(low+high)/2;
- s=0;
- t=2*n+1;
- nv=t+1;
- memset(head,-1,sizeof(head));
- cnt=0;
- for(i=1;i<=n;i++)
- {
- add(s,i,g1[i]);
- add(i,t,g2[i]);
- for(j=1;j<i;j++)
- {
- if(mp[i][j]<=mid)
- {
- add(i,j,INF);
- }
- }
- }
- x=isap();
- //printf("---%d\n",x);
- if(x>=sum)
- {
- ans=mid;
- high=mid-1;
- }
- else
- {
- low=mid+1;
- }
- }
- if(ans==-1)
- printf("No Solution\n");
- else
- printf("%d\n",ans);
- }
- return 0;
- }
POJ 3228Gold Transportation(二分+最大流)的更多相关文章
- POJ 3057 Evacuation 二分+最大流
Evacuation 题目连接: http://poj.org/problem?id=3057 Description Fires can be disastrous, especially when ...
- poj 2391 Ombrophobic Bovines, 最大流, 拆点, 二分, dinic, isap
poj 2391 Ombrophobic Bovines, 最大流, 拆点, 二分 dinic /* * Author: yew1eb * Created Time: 2014年10月31日 星期五 ...
- poj 2391 Ombrophobic Bovines 最短路 二分 最大流 拆点
题目链接 题意 有\(n\)个牛棚,每个牛棚初始有\(a_i\)头牛,最后能容纳\(b_i\)头牛.有\(m\)条道路,边权为走这段路所需花费的时间.问最少需要多少时间能让所有的牛都有牛棚可待? 思路 ...
- poj 2318 叉积+二分
TOYS Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 13262 Accepted: 6412 Description ...
- uvalive 3231 Fair Share 公平分配问题 二分+最大流 右边最多流量的结点流量尽量少。
/** 题目: uvalive 3231 Fair Share 公平分配问题 链接:https://vjudge.net/problem/UVALive-3231 题意:有m个任务,n个处理器,每个任 ...
- poj 2049(二分+spfa判负环)
poj 2049(二分+spfa判负环) 给你一堆字符串,若字符串x的后两个字符和y的前两个字符相连,那么x可向y连边.问字符串环的平均最小值是多少.1 ≤ n ≤ 100000,有多组数据. 首先根 ...
- HDU3081 Marriage Match II —— 传递闭包 + 二分图最大匹配 or 传递闭包 + 二分 + 最大流
题目链接:https://vjudge.net/problem/HDU-3081 Marriage Match II Time Limit: 2000/1000 MS (Java/Others) ...
- HDU-3081-Marriage Match II 二分图匹配+并查集 OR 二分+最大流
二分+最大流: 1 //题目大意:有编号为1~n的女生和1~n的男生配对 2 // 3 //首先输入m组,a,b表示编号为a的女生没有和编号为b的男生吵过架 4 // 5 //然后输入f组,c,d表示 ...
- hdu4560 不错的建图,二分最大流
题意: 我是歌手 Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total Subm ...
随机推荐
- <a>元素生成多个<a>的问题,元素标签结尾影响
告诉我不是真的吧,<a/>和<a></a>真的有区别...
- php小数点后取两位的三种实现方法
php小数点后取两位的方法. 方法一.经常用到小数点后取几位,但不能进位的情况. 比如3.149569取小数点后两位,最后两位不能四舍五入.结果:3.14. 可以使用函数floor. 该函数是舍去取整 ...
- Window下 Qt 编译MySQL驱动(居然用到了动态库格式转换工具)
一步步在Window下开发Qt 今天开始安装MySQL,看了些关于MySQL安装的博文,方法大致相同,但是遇到的细节问题各有不同,或者没有讲全面,下面来说说个人的安装过程及遇到的问题. 1.首先下载, ...
- GitHub Android 最火开源项目Top20 GitHub 上的开源项目不胜枚举,越来越多的开源项目正在迁移到GitHub平台上。基于不要重复造轮子的原则,了解当下比较流行的Android与iOS开源项目很是必要。利用这些项目,有时能够让你达到事半功倍的效果。
1. ActionBarSherlock(推荐) ActionBarSherlock应该算得上是GitHub上最火的Android开源项目了,它是一个独立的库,通过一个API和主题,开发者就可以很方便 ...
- 关于mysqli 连接数不能正确释放的解决方案
/** * 析构函数 */ //解决重复链接的问题 private $db_handler = null; function __destruct() { Log::logWrite($this-&g ...
- 在 Windows Azure 网站中配置动态 IP 地址限制
我们最近对 Windows Azure 网站进行了升级,并启用了IIS8的动态 IP 限制模块.现在,开发人员可以为其网站启用并配置动态 IP 限制功能(或简称 DIPR). 可以通过以下链接查看此 ...
- MyGui 3.2.0(OpenGL平台)的编译
MyGui是一个用来创建用户图形界面的库,用于游戏和3D应用程序.这个库的主要目标是达到:快速.灵活.易用. 1.下载准备: 源代码:http://svn.code.sf.net/p/my-gui/c ...
- iOS设计模式——MVC(Model-View-Controller)
Modol View Controller(MVC)是一种最早的也是最成功的可重用的设计模式,70年代的时候首次在smaltalk编写的程序中成功使用.基于MVC设计 模式,Cocoa整体架构可以划分 ...
- 生产环境提升rman备份速度----启动块跟踪
生产环境提升rman备份速度----启动块跟踪 [环境] AIX(5300-08).oracle10g(10.2.0.1.0-64bit) [目标] 因为生产环境数据量较大,欲加快rman备份的速度 ...
- docker基础入门之二
一.docker文件系统: linuxFS包括boot file system 和 root file system boot file system (bootfs),包含bootloader和ke ...