题意:一共有N个城市,一些城市里有金矿,一些城市里有仓库,金矿和仓库都有一个容量,有M条边,每条边是双向的,有一个权值,求将所有金矿里的储量都运送到仓库中,所需要经过的道路中,使最大的权值最小

思路:增设一个超级源点和一个超级汇点,源点与每一个城市相连,容量为黄金数量,汇点与仓库相连,容量为仓库的容量,然后就是二分最小的最大相邻距离,跑最大流验证。






#include<stdio.h>
#include<string.h>
const int N=410;
const int inf=0x3fffffff;
int dis[N],gap[N],head[N],num,start,end,ans,n,m;
int v1[N],v2[N];
struct edge
{
int st,ed,flow,next;
}E[210000];
struct node
{
int x,y,w;
}P[100000];
void addedge(int x,int y,int w)
{
E[num].st=x;E[num].ed=y;E[num].flow=w;E[num].next=head[x];head[x]=num++;
E[num].st=y;E[num].ed=x;E[num].flow=0;E[num].next=head[y];head[y]=num++;
}
int dfs(int u,int minflow)
{
if(u==end)return minflow;
int i,v,f,flow=0,min_dis=ans-1;
for(i=head[u];i!=-1;i=E[i].next)
{
if(E[i].flow)
{
v=E[i].ed;
if(dis[v]+1==dis[u])
{
f=dfs(v,E[i].flow>minflow-flow?minflow-flow:E[i].flow);
E[i].flow-=f;
E[i^1].flow+=f;
flow+=f;
if(flow==minflow)break;
if(dis[start]>=ans)return flow;
}
min_dis=min_dis>dis[v]?dis[v]:min_dis;
}
}
if(flow==0)
{
if(--gap[dis[u]]==0)
dis[start]=ans;
dis[u]=min_dis+1;
gap[dis[u]]++;
}
return flow;
}
int isap()
{
int maxflow=0;
memset(dis,0,sizeof(dis));
memset(gap,0,sizeof(gap));
gap[0]=ans;
while(dis[start]<ans)
maxflow+=dfs(start,inf);
return maxflow;
}
void makemap(int D)
{
memset(head,-1,sizeof(head));num=0;
int i,x,y;
for(i=1;i<=n;i++)
{
addedge(i,i+n,inf);
addedge(start,i,v1[i]);
addedge(i+n,end,v2[i]);
}
for(i=0;i<m;i++)
{
x=P[i].x;y=P[i].y;
if(P[i].w<=D)
{
addedge(x+n,y,inf);
addedge(y+n,x,inf);
}
}
}
int main()
{
int i,total,sum,flag,L,R,mid;
while(scanf("%d",&n),n)
{
total=sum=0;
for(i=1;i<=n;i++)
{
scanf("%d",&v1[i]);
sum+=v1[i];
}
for(i=1;i<=n;i++)
{
scanf("%d",&v2[i]);
total+=v2[i];
}
if(sum>total){printf("No Solution\n");continue;}
scanf("%d",&m);
for(i=0;i<m;i++)
scanf("%d%d%d",&P[i].x,&P[i].y,&P[i].w);
start=n+n+1;end=n+n+2;ans=end;L=0;R=10000;flag=-1;
while(L<=R)
{
mid=(L+R)/2;
makemap(mid);
if(isap()==sum)
{
flag=mid;
R=mid-1;
}
else L=mid+1;
}
if(flag==-1)printf("No Solution\n");
else printf("%d\n",flag);
}
return 0;
}

hdu 3228 (最大流+二分)的更多相关文章

  1. HDU 3081 最大流+二分

    Marriage Match II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  2. HDU 3277 最大流+二分

    Marriage Match III Time Limit: 10000/4000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  3. HDU 3081 Marriage Match II (网络流,最大流,二分,并查集)

    HDU 3081 Marriage Match II (网络流,最大流,二分,并查集) Description Presumably, you all have known the question ...

  4. HDU 1532 最大流入门

    1.HDU 1532 最大流入门,n个n条边,求第1点到第m点的最大流.只用EK做了一下. #include<bits/stdc++.h> using namespace std; #pr ...

  5. Risk UVA - 12264 拆点法+最大流+二分 最少流量的节点流量尽量多。

    /** 题目:Risk UVA - 12264 链接:https://vjudge.net/problem/UVA-12264 题意:给n个点的无权无向图(n<=100),每个点有一个非负数ai ...

  6. hdu 1853 Cyclic Tour (二分匹配KM最小权值 或 最小费用最大流)

    Cyclic Tour Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/65535 K (Java/Others)Total ...

  7. HDU 3081 最大流+并查集

    题意:有n个男生和n个女生,玩结婚游戏,由女生选择男生:女生可以选择不会和她吵架的男生以及不会和她闺蜜吵架的男生,闺蜜的闺蜜也是闺蜜.问你最多可以进行多少轮,每一轮每个女生只能选择一个之前她没选过的男 ...

  8. BZOJ-3130 费用流 (听题目胡扯丶裸最大流) 二分判定+最大流+实数精度乱搞

    DCrusher爷喜欢A我做的水题,没办法,只能A他做不动的题了.... 3130: [Sdoi2013]费用流 Time Limit: 10 Sec Memory Limit: 128 MBSec ...

  9. BZOJ-1305 dance跳舞 建图+最大流+二分判定

    跟随YveH的脚步又做了道网络流...%%% 1305: [CQOI2009]dance跳舞 Time Limit: 5 Sec Memory Limit: 162 MB Submit: 2119 S ...

随机推荐

  1. css区分ie6,7,ff

    IE6能识别*,但不能识别 !important,IE7能识别*,也能识别!important;FF不能识别*,但能识别!important; 可以这样区别FF,IE7,IE6: background ...

  2. check the manual that corresponds to your MySQL server version for the right syntax的错误解析

    错误原因一:SQL关键字冲突 分析:例:把desc命名为字段名 错误原因二:$right=$DB->fetch_one_array("SELECT rsnumber FROM &quo ...

  3. 应用AXIS开始Web服务之旅(soap web services)——使用三种不同的语言访问创建的Web服务,分别是JAVA、VB、VC

    一. 介绍 本文并不是想介绍Web服务的原理.系统架构等,我们假设您已经了解了关于Web服务的一些基本的概念.原理等知识.本文主要是针对那些已经了解Web服务概念,但是还没有亲身体会Web服务所带来令 ...

  4. iOS判断机型

    #import <Foundation/Foundation.h> #import <UIKit/UIKit.h> typedef NS_OPTIONS(NSInteger,D ...

  5. JAVA学习第一课(初识JAVA)

    PS:退ACM集训队了,自己也疯玩了两天,后天就开学了,就正式大二了,该收收心好好学习啦                                                         ...

  6. poj1637Sightseeing tour(混合图欧拉回路)

    题目请戳这里 题目大意:求混合图欧拉回路. 题目分析:最大流.竟然用网络流求混合图的欧拉回路,涨姿势了啊啊.. 其实仔细一想也是那么回事.欧拉回路是遍历所有边一次又回到起点的回路.双向图只要每个点度数 ...

  7. j详细说明ava于clone办法

    原文地址:http://leihuang.org/2014/11/14/java-clone/ In java, it essentially means the ability to create ...

  8. Libcurl安装及编译

    1.安装curl wget http://curl.haxx.se/download/curl-7.26.0.tar.gz tar -zxvf curl-7.26.0.tar.gz  cd curl- ...

  9. 记WebUtility.HtmlDecode将&nbsp;转成特殊空格的问题

    在.net中 System.Web.HttpUtility.HtmlDecode(或者WebUtility.HtmlDecode) 方法会将   解码为特殊空格(Ascii值为,对应的值为:\u00A ...

  10. HDU - 1116 Play on Words(欧拉图)

    有向图是否具有欧拉通路或回路的判定: 欧拉通路:图连通:除2个端点外其余节点入度=出度:1个端点入度比出度大1:一个端点入度比出度小1 或 所有节点入度等于出度 欧拉回路:图连通:所有节点入度等于出度 ...