River Problem

题意:一个有向树(河流),只有一个汇点1,每条边只有一个出度。有些河道有污染指数xi,必需要治理,有m段路径,可以去覆盖这些,每被覆盖一次,xi降低响应值。

:即 给出一些边必需要覆盖的次数,用m段路径去覆盖,每次覆盖有相应费用,求最小费用。

思路:这题被誉为难题,给一个网络流,给出一些边的流量下界,以及给用某些路段流量去流满足要求。这里与正常网络流相悖,是wi>=xi,所以用:

预先加灌法:(预先灌入大流量(相应干道大小灌溉相应流量),要覆盖的减掉,使达不到预期流量,而用添加费用来补充,恰好跑最小费用最大流)

相应河道流量为U-wi(wi为要覆盖次数),再给的路径直接连边。如果没有wi,那么必然最大流为 U*主干道流量。应该有这些污染指数,所以在某些边流量变窄了!,再没有花费路径补充流量的情况下,比如达不到最大流,就无解,这样起到补充作用。

取之官方思路:

这里u取wi最大值略大(50)即可.

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
const int inf=0x3f3f3f3f;
const int maxv=301,maxe=10001;
int nume=0;int head[maxv];int e[maxe][4];
void inline adde(int i,int j,int c,int w)         //网络流图
{  e[nume][0]=j;e[nume][1]=head[i];head[i]=nume;e[nume][2]=c;e[nume++][3]=w;e[nume][0]=i;e[nume][1]=head[j];head[j]=nume;e[nume][2]=0;e[nume++][3]=-w;
}
int nume2=0;int head2[maxv];int e2[maxe][4];
void inline adde2(int i,int j,int c,int w)              //原图
{e2[nume2][0]=j;e2[nume2][1]=head2[i];head2[i]=nume2;e2[nume2][2]=c;e2[nume2++][3]=w;
}
int numfa[maxv];                              //即dp[i]:i的边干道宽度/包含叶子数
int outd[maxv];
int n,m;int ss,tt;
int inq[maxv];int d[maxv]; int pre[maxv];int prv[maxv];
bool spfa(int &sum,int &sumflow)
{for(int i=0;i<=n;i++){inq[i]=0;d[i]=inf;}queue<int>q;q.push(ss);inq[ss]=1;d[ss]=0;while(!q.empty()){int cur=q.front();q.pop();inq[cur]=0;for(int i=head[cur];i!=-1;i=e[i][1]){int v=e[i][0];if(e[i][2]>0&&d[cur]+e[i][3]<d[v]){d[v]=d[cur]+e[i][3];pre[v]=i;prv[v]=cur;if(!inq[v]){q.push(v);inq[v]=1;}}}}if(d[tt]==inf)return 0;int cur=tt;int minf=inf;while(cur!=ss){int fe=pre[cur];minf=e[fe][2]<minf?e[fe][2]:minf;cur=prv[cur];}cur=tt;while(cur!=ss){e[pre[cur]][2]-=minf;e[pre[cur]^1][2]+=minf;cur=prv[cur];}sum+=d[tt]*minf;sumflow+=minf;return 1;
}
int sumcost(int &sumflow)
{int sum=0;while(spfa(sum,sumflow));return sum;
}
int dfs_getnumfa(int u)                 // 记录出i所包含的叶子数(源点数)
{if(u==0)return 1;for(int i=head2[u];i!=-1;i=e2[i][1]){int v=e2[i][0];numfa[u]+=dfs_getnumfa(v);}return numfa[u];
}
void read_build()
{scanf("%d",&n);int aa,bb,cc,ww;for(int i=0;i<n-1;i++){scanf("%d%d%d",&aa,&bb,&cc);adde2(bb,aa,0,cc);         //反向建树,原来的是倒的树outd[bb]++;}for(int i=1;i<=n;i++){if(outd[i]==0)            //源点{adde2(i,0,0,0);}}numfa[0]=1;dfs_getnumfa(1);for(int i=0;i<=n;i++){for(int j=head2[i];j!=-1;j=e2[j][1]){int v=e2[j][0];adde(v,i,numfa[v]*50-e2[j][3],0);}}scanf("%d",&m);for(int i=0;i<m;i++){scanf("%d%d%d%d",&aa,&bb,&cc,&ww);adde(aa,bb,cc,ww);}
}
void init()
{nume=0;memset(head,-1,sizeof(head));nume2=0;memset(head2,-1,sizeof(head2));memset(numfa,0,sizeof(numfa));memset(outd,0,sizeof(outd));ss=0;tt=1;
}
int main()
{int T;scanf("%d",&T);for(int ii=1;ii<=T;ii++){init();read_build();int sumflow=0;int ans=sumcost(sumflow);if(sumflow!=numfa[1]*50)printf("Case #%d: -1\n",ii);elseprintf("Case #%d: %d\n",ii,ans);}return 0;
}

转载于:https://www.cnblogs.com/yezekun/p/3925774.html

hdu3947 给一些已知(需费用)路径去覆盖一些边 //预先加灌法费用流相关推荐

  1. 已知两点经纬度求球面最短距离的公式推导过程(几何法加向量法)

    已知两点经纬度计算球面距离的公式,一搜一大堆,形式如下: 可是至于这个公式为什么是这样的,今天推导了一下,详细推导过程如下.首先画个图(图1),要不然空间想象能力差的话容易犯糊涂.首先对图1做个大致的 ...

  2. python基础教程zip密码_python基础教程Python实现加密的RAR文件解压的方法(密码已知)...

    博主之前在网上找了很多资料,发现rarfile库不能直接调用,需要安装unrar模块,下面将详细介绍整个实现流程. 第一步:安装unrar模块,直接pip install unrar可能会找不到库,需 ...

  3. 一、后端:针对用JAVA POI解决已知路径WORD文件增加自定义页眉,灵活设置页眉字体部分样式@2019

    一.获取添加页眉doc文件 我的项目文件路径: String reportSavePath= "****************"; DOCX文件一: changer.setAcc ...

  4. 已知序列求蝶形运算_在N=32的基 2 时间抽取发 FFT 运算流图中,从 到 需______级蝶形运算过程。 (4.0分)_学小易找答案...

    [单选题]互相关函数性质正确的是: [计算题]两个有限长的复序列 x[n] 和 h[n] ,其长度分别为 N 和 M ,设两序列的线性卷积为 y[n]=x[n]*h[n] ,回答下列问题: (1) 序 ...

  5. Visual Studio 2017 已知问题 Qamp;amp;A

    已知问题 以下是有关此版本中的已知问题和可用解决方法的说明.M姐会给大家进行详细的解答 安装问题 编辑器和 IDE 问题 NuGet 问题 实时单元测试问题 测试工具问题 轻量级解决方案加载问题 We ...

  6. 已知两点坐标拾取怎么操作_已知的操作员学习-第4部分

    已知两点坐标拾取怎么操作 有关深层学习的FAU讲义 (FAU LECTURE NOTES ON DEEP LEARNING) These are the lecture notes for FAU's ...

  7. Solidity 安全:已知攻击方法和常见防御模式综合列表

    目录 重入漏洞 漏洞 预防技术 真实世界的例子:DAO 算法上下溢出 漏洞 预防技术 实际示例:PoWHC和批量传输溢出(CVE-2018-10299) 不期而至的Ether 漏洞 预防技术 真实世界 ...

  8. c语言已知加速度求位移速度,知道初速度知道加速度求位移的公式

    知道初速度知道加速度求位移的公式以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 知道初速度知道加速度求位移的公式 高一物 ...

  9. MATLAB轻松绘制地图路线——已知及未知坐标下的处理方法(1)

    文章目录 已知坐标的情况 未知坐标的情况 完整工程文件下载链接: 要想绘制地图路线, 最基本的要素就是 各点的坐标,有了坐标,还要知道哪个点和哪个点相连,最后将各点相连即可: 但有时候我们有的往往只是 ...

  10. Android百度地图 - 在地图上标注已知GPS纬度经度值的一个或一组覆盖物 - OPEN 开发经验库 - 360安全浏览器 8.1...

    Android百度地图 - 在地图上标注已知GPS纬度经度值的一个或一组覆盖物 - OPEN 开发经验库 - 360安全浏览器 8.1 首页   代码   文档   问答   资讯   经验   Gi ...

最新文章

  1. 推荐7个能提高工作效率的办公软件,拯救你的工作!
  2. html Qestionnaire表单
  3. c语言编程小项目300行,求几个c语言的小项目做?
  4. html段落加边框,Word2010怎样为段落加上边框
  5. MySQL数据库优化实战
  6. 【机器视觉】 dev_set_shape算子
  7. Python3 matplotlib的绘图函数subplot()简介
  8. linux下查看mysql的当前连接情况
  9. php异步处理任务工具,php异步任务处理: gearman
  10. object detection错误之no module named nets
  11. java kafka 消费_java利用kafka生产消费消息
  12. 打印php错误日志,php怎样打印错误日志
  13. redis 基础数据结构实现
  14. JAVA在线购物B2C商城源码
  15. 办公用品管理系统服务器版,恒达办公用品管理系统
  16. java itext pdf 添加页码
  17. Windows 下 Spark+Hadoop+Scala 安装
  18. 算法入门模拟-剪刀石头布
  19. Unity 2019.3现已发布
  20. 别人笑我太疯癫,我笑他人看不穿。

热门文章

  1. jquery.hotkeys监听键盘按下事件keydown
  2. PCDJ DEX 3 for mac(DJ混音打碟工具)
  3. 急!Mac无法修复磁盘,应该怎么办? 看 这 里!
  4. mac上捕获Dock截图的方法
  5. 【科普】什么是TLS1.3
  6. Phpcms v9 整合Discuz! X2.5 和UCenter 1.6.0详细教程
  7. STSegmentedControl
  8. 打造自己的VC++ 6.0免安装简版
  9. 苹果mac视频剪辑软件:Final Cut Pro
  10. 如何删除 Mac 上的 Office 许可证文件?