题目描述

题解:

每条边至少经过一次,说明经过下界为$1$。

然后套有源汇上下界最小费用可行流板子。

口胡一下。

此类问题的建图通式为:

1.假设原来的边流量上下界为$[l,r]$,那么在新图中建流量上界为$(r-l)$的边;

就是必须流的先流完,不一定的一会再算。

2.统计一下每个点流入的$l$之和$ind$以及流出的$l$之和$otd$,设$d=ind-otd$;

若$d>0$,则建一条从新源点到该点的、容量为$d$的边,表示减下界的时候多减了,要加回来;

若$d<0$,则建一条从该点到新汇点的、容量为$-d$的边,表示加多了,要减回来。

3.旧汇点->旧源点,容量为$inf$,有借有还再借不难

然后求新图的最小费用最大流,答案即为最小费用+所有边的费用*下界。

代码:

  1. #include<queue>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. using namespace std;
  6. typedef long long ll;
  7. const int N = ;
  8. const int inf = 0x3f3f3f3f;
  9. const ll Inf = 0x3f3f3f3f3f3f3f3fll;
  10. template<typename T>
  11. inline void read(T&x)
  12. {
  13. T f = ,c = ;char ch=getchar();
  14. while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
  15. while(ch>=''&&ch<=''){c=c*+ch-'';ch=getchar();}
  16. x = f*c;
  17. }
  18. int n,hed[N],cnt=-,S,T,otd[N],ind[N],SS,TT;
  19. struct EG
  20. {
  21. int to,nxt;
  22. ll f,w;
  23. }e[*N];
  24. void ae(int f,int t,ll fl,ll wl)
  25. {
  26. e[++cnt].to = t;
  27. e[cnt].nxt = hed[f];
  28. e[cnt].f = fl;
  29. e[cnt].w = wl;
  30. hed[f] = cnt;
  31. }
  32. void AE(int f,int t,ll fl,ll wl)
  33. {
  34. ae(f,t,fl,wl);
  35. ae(t,f,,-wl);
  36. }
  37. int pre[N],fa[N];
  38. ll dis[N],fl[N],ans;
  39. bool vis[N];
  40. bool spfa()
  41. {
  42. queue<int>q;
  43. memset(dis,0x3f,sizeof(dis));
  44. dis[SS]=,fl[SS]=Inf,vis[SS]=;q.push(SS);
  45. while(!q.empty())
  46. {
  47. int u = q.front();
  48. q.pop();
  49. for(int j=hed[u];~j;j=e[j].nxt)
  50. {
  51. int to = e[j].to;
  52. if(e[j].f&&dis[to]>dis[u]+e[j].w)
  53. {
  54. dis[to]=dis[u]+e[j].w;
  55. fl[to]=min(fl[u],e[j].f);
  56. fa[to]=u,pre[to]=j;
  57. if(!vis[to])
  58. {
  59. vis[to]=;
  60. q.push(to);
  61. }
  62. }
  63. }
  64. vis[u]=;
  65. }
  66. return dis[TT]!=Inf;
  67. }
  68. ll mcmf()
  69. {
  70. ll ret = ;
  71. while(spfa())
  72. {
  73. ret+=fl[TT]*dis[TT];
  74. int u = TT;
  75. while(u!=SS)
  76. {
  77. e[pre[u]].f-=fl[TT];
  78. e[pre[u]^].f+=fl[TT];
  79. u=fa[u];
  80. }
  81. }
  82. return ret;
  83. }
  84. int main()
  85. {
  86. read(n);
  87. S=,T=n+;
  88. SS=n+,TT=n+;
  89. memset(hed,-,sizeof(hed));
  90. for(int k,t,w,i=;i<=n;i++)
  91. {
  92. read(k);
  93. while(k--)
  94. {
  95. read(t),read(w);
  96. ind[t]++,otd[i]++;
  97. AE(i,t,inf,w);
  98. ans+=w;
  99. }
  100. if(i!=)AE(i,T,inf,);
  101. }
  102. for(int i=;i<=n+;i++)
  103. {
  104. int d = ind[i]-otd[i];
  105. if(d<)AE(i,TT,-d,);
  106. else AE(SS,i,d,);
  107. }
  108. AE(T,S,inf,);
  109. ans+=mcmf();
  110. printf("%lld\n",ans);
  111. return ;
  112. }

Ahoi2014&Jsoi2014 支线剧情的更多相关文章

  1. BZOJ3876[Ahoi2014&Jsoi2014]支线剧情——有上下界的最小费用最大流

    题目描述 [故事背景] 宅男JYY非常喜欢玩RPG游戏,比如仙剑,轩辕剑等等.不过JYY喜欢的并不是战斗场景,而是类似电视剧一般的充满恩怨情仇的剧情.这些游戏往往 都有很多的支线剧情,现在JYY想花费 ...

  2. BZOJ3876 [Ahoi2014&Jsoi2014]支线剧情 【有上下界费用流】

    题目 [故事背景] 宅男JYY非常喜欢玩RPG游戏,比如仙剑,轩辕剑等等.不过JYY喜欢的并不是战斗场景,而是类似电视剧一般的充满恩怨情仇的剧情.这些游戏往往 都有很多的支线剧情,现在JYY想花费最少 ...

  3. [AHOI2014/JSOI2014]支线剧情

    题目 有源汇上下界最小费用可行流 首先注意到要求是每一条边都经过至少一次,所以对于每一条边我们设成\([1,\infty]\)就好了 另外所有点都能结束剧情,所有点都要向汇点\(t\)连一条\([0, ...

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

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

  5. bzoj3876: [Ahoi2014&Jsoi2014]支线剧情

    题意:给一幅图,从1开始,每条边有边权最少走一遍,可以在任意点退出,问最小花费 题解:上下界费用流,每个边都流一遍,然后为了保证流量平衡,新建源点汇点,跑费用流把流量平衡 /************* ...

  6. [AHOI2014/JSOI2014]支线剧情 有上下界费用流

    ---题面--- 题解: 第一眼费用流,,然后想了好久怎么建图,,,最后发现是最小费用可行流的板子题.... 其实还没有很懂这个算法,所以这里只是摆一下步骤,以后再补理解吧. 首先一个思路就是转换图, ...

  7. bzoj3876: [Ahoi2014&Jsoi2014]支线剧情(上下界费用流)

    传送门 一道题让我又要学可行流又要学zkw费用流…… 考虑一下,原题可以转化为一个有向图,每次走一条路径,把每一条边都至少覆盖一次,求最小代价 因为一条边每走过一次,就要付出一次代价 那不就是费用流了 ...

  8. 【BZOJ3876】[AHOI2014&JSOI2014] 支线剧情(无源汇有上下界网络流)

    点此看题面 大致题意: 有一张\(DAG\),经过每条边有一定时间,从\(1\)号点出发,随时可以返回\(1\)号点,求经过所有边的最短时间. 无源汇有上下界网络流 这是无源汇有上下界网络流的板子题. ...

  9. 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 ...

随机推荐

  1. (水题)Codeforces - 327C - Magic Five

    https://codeforces.com/problemset/problem/327/C 因为答案可以有前导零,所以0和5一视同仁.每个小节内,以排在第 $i$ 个的5为结尾的序列即为在前面 $ ...

  2. 洛谷 - P1012 - 拼数 - 排序

    https://www.luogu.org/problemnew/show/P1012 这道水题居然翻车了,还发现不了bug,服气了.并不是空字符一定比不空要好,要取决于替代它的字符的大小.所以还是直 ...

  3. Unity脚本打包android工程

    using UnityEngine; using System.Collections; using UnityEditor; public class NewBehaviourScript : Ed ...

  4. Linux下下载百度网盘资料

    因为百度网盘没有Linux下的客户端,所以无法直接下载网盘里的资料了.各路大神各显神通,提出了各种解决方法,这里只介绍两种. 1.BaiduPCS Github上有人通过Go语言写了一个Baidu网盘 ...

  5. Luogu P2170选学霸【并查集+背包】By cellur925

    题目传送门 开始看到本题完全认为就是个彻头彻尾的并查集,只要把实力相当的人都并到一个集合中,最后再找一共有多少联通块即可. 后来发现这是大错特错的qwq.因为选了一个集合中的某人,那这个集合中所有人就 ...

  6. Oracle中dblink的创建与删除

    查询数据库中有哪些dblink连接 select * from dba_objects where object_type='DATABASE LINK'; 删除公有的EMIS_PRODUCTOIN连 ...

  7. layui开始时间小于结束时间

    直接上代码 // var endDate= laydate.render({ // elem: '#end_time',//选择器结束时间 // type: 'datetime', // min:&q ...

  8. SAE上无法加载css等文件

    如果你的SAE用到了这些文件,你会发现本地虽然能够运行成功,但是SAE上却无法加载. 其实就是地址发生了变化,我们告诉SAE这些东西怎么找就可以了. 例如我的css和js文件放在了app/static ...

  9. JDBC——入门知识【转】

      1. 什么是JDBC:Java数据库连接性(JavaDatabase Connectivity) API,允许用户从Java应用程序中访问任何表格化数据源. 2. JDBC除了提供到更宽范围的SQ ...

  10. C++ <string> 里面的size_type

    string::size_type string的 str.size() 返回值是一个unsigned,实际上返回的是size_type类型的值. string类和其他的大多数标准库类型都定义了几套配 ...