题面:洛谷传送门 BZOJ传送门

题目大意:给你一张有向无环图,边有边权,让我们用任意条从1号点开始的路径覆盖这张图,需要保证覆盖完成后图内所有边都被覆盖至少一次,求覆盖路径总长度的最小值

最小费用可行流板子题..

有源汇最小费用可行流

给定一张有源汇网络流图,必须保证图中每条边的流量都$\in[l,r]$,求最小费用的可行流

我们要想办法把问题转化成最小费用最大流,即每条边流量需求都是$[0,r-l]$的

对于每个点,设$p_{i}$表示$i$点 入边流量下界之和 减掉 出边流量下界之和

根据流量守恒,且我们要求的是最小费用可行流,多余的(去掉后仍然符合要求的)流量要尽可能少

如果$p_{i}>0$,说明当流量尽可能少的时候,流入>流出,修改流量上下界以后,这个点必须要多输入$p_{i}$点流量,才能保证符合流入的下界要求

源点$S$向$i$点连一条流量为$p_{i}$,费用为$0$的边

反之$p_{i}<0$,流出>流入,这个点必须要多输出$p_{i}$点流量,才能保证符合流出的下界要求

$i$点向汇点$T$连一条流量为$p_{i}$,费用为$0$的边

图中的其他边流量都是$[0,r-l]$,费用不变

然后跑最小费用最大流即可

对这道题而言,把$DAG$看成网络流图,那么我们需要保证图中每条边都有流量,即流量的合法范围是$[1,inf]$,按上述方式建图后,跑最小费用最大流即可

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. #define N1 310
  5. #define M1 6010
  6. using namespace std;
  7. const int inf=0x3f3f3f3f;
  8.  
  9. int gint()
  10. {
  11. int ret=,fh=;char c=getchar();
  12. while(c<''||c>''){if(c=='-')fh=-;c=getchar();}
  13. while(c>=''&&c<=''){ret=ret*+c-'';c=getchar();}
  14. return ret*fh;
  15. }
  16. struct Edge{
  17. int to[M1<<],nxt[M1<<],flow[M1<<],cost[M1<<],head[N1],cte;
  18. void ae(int u,int v,int f,int c)
  19. {
  20. cte++; to[cte]=v; nxt[cte]=head[u];
  21. head[u]=cte; flow[cte]=f; cost[cte]=c;
  22. }
  23. }e;
  24.  
  25. int dis[N1],use[N1],que[M1*],flow[N1],id[N1],hd,tl,S,T;
  26. int n,K[N1],cnt;
  27. int spfa()
  28. {
  29. int x,j,v;
  30. memset(dis,0x3f,(T+)<<); memset(flow,,(T+)<<);
  31. hd=,tl=; que[++tl]=S; dis[S]=; use[S]=; flow[S]=inf;
  32. while(hd<=tl)
  33. {
  34. x=que[hd++];
  35. for(j=e.head[x];j;j=e.nxt[j])
  36. {
  37. v=e.to[j];
  38. if( dis[v]>dis[x]+e.cost[j] && e.flow[j]> )
  39. {
  40. dis[v]=dis[x]+e.cost[j]; id[v]=j;
  41. flow[v]=min(flow[x],e.flow[j]);
  42. if(!use[v]) que[++tl]=v, use[v]=;
  43. }
  44. }
  45. use[x]=;
  46. }
  47. return dis[T]!=inf;
  48. }
  49. int mxflow=,tcost=;
  50. void EK()
  51. {
  52. int x,fl;
  53. while(spfa())
  54. {
  55. fl=flow[T]; mxflow+=fl; tcost+=fl*dis[T];
  56. for(x=T;x!=S;x=e.to[id[x]^])
  57. {
  58. e.flow[id[x]]-=fl;
  59. e.flow[id[x]^]+=fl;
  60. }
  61. }
  62. }
  63. int inc[N1];
  64.  
  65. int main()
  66. {
  67. scanf("%d",&n);
  68. int i,j,x,y,v,ans=; S=; T=n+; e.cte=;
  69. e.ae(S,,inf,); e.ae(,S,,);
  70. for(i=;i<=n;i++)
  71. {
  72. K[i]=gint();
  73. for(j=;j<=K[i];j++)
  74. {
  75. x=gint(); y=gint();
  76. inc[i]--; inc[x]++; ans+=y;
  77. e.ae(i,x,inf,y); e.ae(x,i,,-y);
  78. }
  79. }
  80. for(i=;i<=n;i++)
  81. {
  82. if(inc[i]>) e.ae(S,i,inc[i],), e.ae(i,S,,);
  83. if(inc[i]<) e.ae(i,T,-inc[i],), e.ae(T,i,,);
  84. }
  85. EK(); ans+=tcost;
  86. printf("%d\n",ans);
  87. return ;
  88. }

BZOJ 3876 [AHOI/JSOI2014]支线剧情 (最小费用可行流)的更多相关文章

  1. bzoj 3876: [Ahoi2014&Jsoi2014]支线剧情【有上下界有源汇最小费用最大流】

    每条边流量有下界有费用,很显然是有上下界有源汇最小费用最大流 连边(s,1,(0,inf),0),(i,t,(0,inf),0),表示从1出发inf次从每个点结束inf次 连边(i,j,(1,inf) ...

  2. BZOJ 3876 [Ahoi2014&Jsoi2014]支线剧情

    题解: 带下界的费用流 对于x->y边权为z Addedge(x,t,1,0) Addedge(s,y,1,z) Addedge(x,y,inf,0) 然后对每个点Addedge(i,1,inf ...

  3. BZOJ 3876 支线剧情 有源汇有上下界最小费用可行流

    题意: 给定一张拓扑图,每条边有边权,每次只能从第一个点出发沿着拓扑图走一条路径,求遍历所有边所需要的最小边权和 分析: 这道题乍一看,可能会想到什么最小链覆盖之类的,但是仔细一想,会发现不行,一是因 ...

  4. [Ahoi2014]支线剧情[无源汇有下界最小费用可行流]

    3876: [Ahoi2014]支线剧情 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1538  Solved: 940[Submit][Statu ...

  5. BZOJ 2055 80人环游世界 有上下界最小费用可行流

    题意: 现在有这么一个m人的团伙,也想来一次环游世界. 他们打算兵分多路,游遍每一个国家.    因为他们主要分布在东方,所以他们只朝西方进军.设从东方到西方的每一个国家的编号依次为1...N.假若第 ...

  6. 【CF708D】Incorrect Flow 最小费用可行流

    [CF708D]Incorrect Flow 题意:给你一个点数为n,边数为m的流网络,每条边有一个容量c和流量f,这个网络可能是不合法的.你可以花费1的代价使c或f减少或增加1,可以修改无限次.你不 ...

  7. bzoj 1877 [SDOI2009]晨跑(最小费用最大流)

    Description Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑.仰卧起坐等 等,不过到目前为止,他坚持下来的只有晨跑. 现在给出一张学校附近的地图,这张地图中包含N个十 ...

  8. bzoj 1927 [Sdoi2010]星际竞速(最小费用最大流)

    1927: [Sdoi2010]星际竞速 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 1576  Solved: 954[Submit][Statu ...

  9. bzoj 2245 [SDOI2011]工作安排(最小费用最大流)

    2245: [SDOI2011]工作安排 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1197  Solved: 580[Submit][Statu ...

随机推荐

  1. SpringBoot支持AJAX跨域请求

    利用注解的方式解决AJAX请求跨域问题 1.编写一个支持跨域请求的 Configuration - 第一种方式 - CorsConfig.java import org.springframework ...

  2. [jQuery]jQuery获取URL参数

    // jQuery url get parameters function [获取URL的GET参数值]// <code>// var GET = $.urlGet(); //获取URL的 ...

  3. Spring注解@RequestMapping请求路径映射问题

    @RequestMapping请求路径映射,假设标注在某个controller的类级别上,则表明訪问此类路径下的方法都要加上其配置的路径.最经常使用是标注在方法上.表明哪个详细的方法来接受处理某次请求 ...

  4. linux命令之man和info

    linux命令之man和info man ➜ ~ man ls result: LS(1)中1这样的数字的意义例如以下所看到的: 代号 内容 1 用户在shell环境中能够操作的命令或可运行文件 2 ...

  5. nginx源代码分析--nginx进程间通信

    Linux下的IPC非常多,nginx的进程都是有亲缘关系的进程,对于他们的通信我们选择TCP socket进行通信.   TCP socket 用来做进程通信的优点有,   1.socket是文件描 ...

  6. Task.ConfigureAwait

    public ConfiguredTaskAwaitable ConfigureAwait( bool continueOnCapturedContext ) Configures an awaite ...

  7. 获取id 获取当前点击元素节点的任意 属性

    <a id="haveproces" onclick="fnProces(event)" dataid="{{x.id}}" clas ...

  8. BZOJ 4259 FFT

    思路: 为什么好多字符串的题都可以用FFT啊.... 我们其实是要判断$\Sigma (a[i]-b[i])^2*a[i]*b[i]==0$ 那就把a串翻转过来 把 上式展开 大力做几遍FFT就好啦~ ...

  9. Svn install and use

    1.安装服务 使用yum安装subversion,简单.不繁琐. 1 yum install -y subversion 2.创建版本库 1 2       mkidr /svn/obj        ...

  10. LUA 创建文件和文件夹

    创建文件: os.execute('mkdir e:\\aa') 创建文件夹: os.execute("cd.>e:\\wang.ini")