题意:一共有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. Notepad++使用技法

    Alt+H 隐藏行 Ctrl+Tab  实现在多个打开的窗口间切换 Ctrl+Shift+Q区块注释 Ctrl+K行注释(取消Ctrl+Shift+K) 文件  新建文件 Ctrl+N  打开文件 C ...

  2. 插入数据,返回最新id

    最简单的方法就是在查询之后select @@indentity. sql代码: INSERT INTO table_name (.....) VALUES(......)  SELECT @@IDEN ...

  3. ThinkPHP第二十三天(Category表结构、PHPExcel导入数据函数)

    1.category分类表表结构id,name,pid,sort,结合category.class.php类使用. 2.PHPExcel导入数据函数示例 function excel_to_mysql ...

  4. IronPython初体验和实战集合等类型转换和类型匹配

    人老了,做什么都累~学到了这么多技术,从最早C到C++再到JAVA再到C#,最终都是为了改善产品,改善系统的可维护性.众所周知C#,C++,C都是强类型语言,什么情况都得定义一些实体类来改变业务模型, ...

  5. laravel安装说明

    1.composer已安装.没安装可以看我上一篇 :http://www.cnblogs.com/seakt/p/4503249.html 2.配置环境变量,找到composer的位置,一般默认都在 ...

  6. oracle 两表数据对比---minus

        1 引言 在程序设计的过程中,往往会遇到两个记录集的比较.如华东电网PMS接口中实现传递一天中变更(新增.修改.删除)的数据.实现的方式有多种,如编程存储过程返回游标,在存储过程中对两批数据进 ...

  7. 微软提供的虚拟磁盘API

    https://msdn.microsoft.com/en-us/library/windows/desktop/dd323684(v=vs.85).aspx https://msdn.microso ...

  8. Light Bulb(三分)

    ZOJ Problem Set - 3203 Light Bulb Time Limit: 1 Second      Memory Limit: 32768 KB Compared to wildl ...

  9. oracle rman异机恢复

      Oracle源主机 Oracle目标主机 主机平台 CentOS6.2(final) CentOs6.2(FInal) 主机名 vick rman IP地址 192.168.1.11 192.16 ...

  10. 倒计时IE6+

    很简单的 下面是我为了做多个倒计时更改之后的 dome 下载链接   兼容 IE7以上 IE6没测试应该没问题 http://yunpan.cn/cf29rxmGKuMyJ  提取码 ca61