Description

小$W$非常喜欢社会主义,这天他开始研究它的优越性。
他发现它们国家十分乐于修建特色的社会主义道路。具体的说,$Z$国有$n$座城市,由$m$条有向边连接,城市从$1$编号。
特色的地方在于,时不时会有一些$LD$下来在城市间视察,视察时他会从城市$b_i$开始,最终到$e_i$结束。每次视察都会走过一些路,这些路自然会被$LD$所注意。
更具体地, $LD$会重修自己走过的路。每条边重修需要的费用也不相同。
而如果视察结束后, $LD$不在一开始自己所在的城市$b_i$,则会要新建一条$VIP$道路送他回家,也就是只有他自己能通过的道路。这需要花费固定的费用$C$,这条道路走过后便会拆毁。
若某个城市没有被$LD$经过,则这个城市的下级$LD$会被勒令整改,也要花费$C$的费用。
现在有$k$年,每年有若干个$LD$下来视察(可能$0$个),每年的固定费用$C$不同。小$W$想知道对于每一年怎样安排他们的视察人数和视察路线,能使得总花费最小。注意,领导至少要视察一条边。
注意,若一条道路被同一个人多次经过,则每次都会重修这条路。多个人多次经过也是一样。没有被$LD$经过的城市,更具体的说是没有被任何$LD$经过。

Input

第一行三个整数$n,m,k$。

接下来$m$行每行三个整数$s_i,t_i,v_i$,表示$s_i$和$t_i$间的有向边,重修需要花费$v_i$的代价。接下来$k$行每行一个整数,表示这一年的固定费用$C$。

Output

输出$k$行,每行一个最小花费。

Sample Input

6 5 3 6

1 3 2

2 3 2

3 4 2

4 5 2

4 6 2

1

5

10

Sample Output

6

21

32

HINT

$2\;\leq\;n\;\leq\;250,1\;\leq\;m\;\leq\;30000,1\;\leq\;k\;\leq\;10000,s_i\not=t_i,1\;\leq\;v_i,C\;\leq\;10000$,一对城市间可能有多条单向路,图中无自环。

Solution

先求出原图的最短路建一张完全图,任意两点间的边权为原图中两点的最短路长度.

可以发现,每个点只会被最优路径经过一次.

由于一个点只被经过一次,且要找出一些路径使得它们的和最小,这非常想最小路径覆盖的模型,拆点建边.

接着做最小费用最大流,若流了$k$路径,则我们需支付$(n-k)C$.

证明:若这$k$路径首尾相连成一个环,则需对剩下$n-k$个城市支付$C$;若不是环,则这$k$路径经过$k+1$个点,需对剩下$n-k-1$个城市支付$C$,以及为$LD$修路回去的$C$.

接下来要决定流几条路径.显然,做费用流时,每次得到的路径的费用是单调不降的,也就是可以在做费用流时判断:若当前的费用$>C$,则停止费用流,剩下的城市用$C$补。

由于有多组$C$,所以考虑提前将所有$n$次流后所得到的费用用前缀和存下来,每次二分出需要流的路径条数.

  1. #include<cmath>
  2. #include<ctime>
  3. #include<queue>
  4. #include<stack>
  5. #include<cstdio>
  6. #include<vector>
  7. #include<cstring>
  8. #include<cstdlib>
  9. #include<iostream>
  10. #include<algorithm>
  11. #define N 505
  12. #define M 125505
  13. #define INF 1000000000
  14. using namespace std;
  15. struct graph{
  16. int nxt,to,f,w;
  17. }e[M];
  18. struct edge{
  19. int s,t,w;
  20. }a[M];
  21. struct tag{
  22. int e,v;
  23. }pre[N];
  24. int d[N][N],g[N],f[N],sum[N],dis[N],c,n,m,s,t,ti,cnt=1;
  25. bool inq[N];queue<int> q;
  26. inline int read(){
  27. int ret=0;char c=getchar();
  28. while(!isdigit(c))
  29. c=getchar();
  30. while(isdigit(c)){
  31. ret=(ret<<1)+(ret<<3)+c-'0';
  32. c=getchar();
  33. }
  34. return ret;
  35. }
  36. inline void addedge(int x,int y,int f,int w){
  37. e[++cnt].nxt=g[x];g[x]=cnt;
  38. e[cnt].to=y;e[cnt].f=f;e[cnt].w=w;
  39. }
  40. inline void adde(int x,int y,int f,int w){
  41. addedge(x,y,f,w);addedge(y,x,0,-w);
  42. }
  43. inline bool spfa(int u){
  44. for(int i=1;i<=t;++i){
  45. dis[i]=INF;inq[i]=false;
  46. }
  47. dis[u]=0;q.push(u);inq[u]=true;
  48. while(!q.empty()){
  49. u=q.front();q.pop();inq[u]=false;
  50. for(int i=g[u];i;i=e[i].nxt)
  51. if(e[i].f>0&&dis[u]+e[i].w<dis[e[i].to]){
  52. dis[e[i].to]=dis[u]+e[i].w;
  53. pre[e[i].to].e=i;pre[e[i].to].v=u;
  54. if(!inq[e[i].to]){
  55. q.push(e[i].to);inq[e[i].to]=true;
  56. }
  57. }
  58. }
  59. return dis[t]<INF;
  60. }
  61. inline int mf(int f){
  62. int ret=0,d;
  63. while(f){
  64. if(!spfa(s)) return -1;
  65. d=f;
  66. for(int i=t;i!=s;i=pre[i].v)
  67. d=min(d,e[pre[i].e].f);
  68. ret+=d*dis[t];f-=d;
  69. for(int i=t;i!=s;i=pre[i].v){
  70. e[pre[i].e].f-=d;
  71. e[pre[i].e^1].f+=d;
  72. }
  73. }
  74. return ret;
  75. }
  76. inline void Aireen(){
  77. n=read();m=read();ti=read();
  78. for(int i=1;i<n;++i)
  79. for(int j=i+1;j<=n;++j)
  80. d[i][j]=d[j][i]=INF;
  81. for(int i=1,j,k,w;i<=m;++i){
  82. j=read();k=read();w=read();
  83. d[j][k]=min(d[j][k],w);
  84. }
  85. for(int k=1;k<=n;++k)
  86. for(int i=1;i<=n;++i)
  87. for(int j=1;j<=n;++j)
  88. d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
  89. t=n+1<<1;s=t-1;
  90. for(int i=1;i<=n;++i){
  91. adde(s,i,1,0);
  92. adde(i+n,i,1,0);
  93. adde(i+n,t,1,0);
  94. }
  95. for(int i=1;i<=n;++i)
  96. for(int j=1;j<=n;++j)
  97. if(i!=j&&d[i][j]<INF)
  98. adde(i,j+n,1,d[i][j]);
  99. for(m=1;m<=n;++m){
  100. f[m]=mf(1);
  101. if(f[m]<0) break;
  102. sum[m]=sum[m-1]+f[m];
  103. }
  104. --m;
  105. int l,r,mid;
  106. while(ti--){
  107. c=read();
  108. l=0;r=m;
  109. while(l<r){
  110. mid=l+r+1>>1;
  111. if(f[mid]<=c) l=mid;
  112. else r=mid-1;
  113. }
  114. printf("%d\n",sum[l]+c*(n-l));
  115. }
  116. }
  117. int main(){
  118. freopen("road.in","r",stdin);
  119. freopen("road.out","w",stdout);
  120. Aireen();
  121. fclose(stdin);
  122. fclose(stdout);
  123. return 0;
  124. }

[日常训练]Z国特色社会路的更多相关文章

  1. 「日常训练」ZgukistringZ(Codeforces Round #307 Div. 2 B)

    题意与分析(CodeForces 551B) 这他妈哪里是日常训练,这是日常弟中弟. 题意是这样的,给出一个字符串A,再给出两个字符串B,C,求A中任意量字符交换后(不限制次数)能够得到的使B,C作为 ...

  2. [日常训练]school

    Description 众所周知,家离学校很远.于是,每天算准了时间出发,以保证能在上课铃响前 秒到达学校. 不幸的是,市最近正在修路.这就导致有些路可能无法通行,因而可能导致迟到. 不打算改变他的出 ...

  3. 集训队日常训练20181124 DIV2

    急急忙忙要出去比赛就拉了一场有点sb的题目 5202: 网络寻路  时间限制(普通/Java):1000MS/3000MS     内存限制:65536KByte总提交: 15            ...

  4. [日常训练]string

    Description 给定一个长度为$n$的字符串,串中的字符保证是前$k$个小写字母.你可以在字符串后再添加$m$个字符,使得新字符串所包含的不同的子序列数量尽量多.当然,前提是只能添加前$k$个 ...

  5. [日常训练]常州集训day5

    T1 Description 小$W$和小$M$一起玩拼图游戏啦~ 小$M$给小$M$一张$N$个点的图,有$M$条可选无向边,每条边有一个甜蜜值,小$W$要选$K$条边,使得任意两点间最多有一条路径 ...

  6. [日常训练]常州集训day2

    T1 Description 给定$N$个点,问这$N$个点能构成的三角形个数. Input 第一行一个整数$N$,代表点数. 接下来$N$行,每行两个非负整数$X,Y$,表示一个点的坐标. Outp ...

  7. 日常训练 dfs 之 拓扑排序

    今天被拓扑排序给折磨了一天,主要就是我的一个代码有点小bug,真难找... 先来看看我今天写的题目吧! C. Fox And Names Fox Ciel is going to publish a ...

  8. 「日常训练」 Fire!(UVA-11624)

    与其说是训练不如说是重温.重新写了Java版本的代码. import java.util.*; import java.math.*; import java.io.BufferedInputStre ...

  9. 「日常训练」Equation(HDU-5937)

    题意与分析 时隔一个月之后来补题.说写掉的肯定会写掉. 题意是这样的:给1~9这些数字,每个数字有\(X_i\)个,问总共能凑成多少个不同的等式\(A+B=C\)(\(A,B,C\)均为1位,\(1+ ...

随机推荐

  1. Html中编码格式的设置,及引入javascript、css的方法

    1.html页面中设置字符编码的格式: <meta http-equiv="Content-Type" content="text/html; charset=ut ...

  2. 决策树ID3算法python实现 -- 《机器学习实战》

    from math import log import numpy as np import matplotlib.pyplot as plt import operator #计算给定数据集的香农熵 ...

  3. Powershell Exchange Server UP Time

    Server up time Get-ExchangeServer | where{$_.name -like'wendy*'} | %{ if(Test-Connection $_.name -Co ...

  4. Howto: Performance Benchmarks a Webserver

    Howto: Performance Benchmarks a Webserver last updated June 9, 2006 in CategoriesApache, FreeBSD, Ho ...

  5. Design Pattern - 命令模式

    一般执行一个操作的过程, 创建对象, 并调用对象的函数, 函数执行, 返回 比如下面的类图, client直接调用Receiver.action 而命令模式, 抽象出command对象, 并在comm ...

  6. Scala 常用语法

    Clojure首先是FP, 但是由于基于JVM, 所以不得已需要做出一些妥协, 包含一些OO的编程方式 Scala首先是OO, Java语法过于冗余, 一种比较平庸的语言, Scala首先做的是简化, ...

  7. Shell下syntax error: operand expected (error token is “-”)

    在这个监控实时网口速率的脚本中,第21,22行存在错误: #!/bin/bash #Modified by lifei4@datangmobile.cn echo ===DTmobile NetSpe ...

  8. TCP原理

    1.http://coolshell.cn/articles/11564.html 2.http://coolshell.cn/articles/11609.html 3.一站式学习wireshark ...

  9. Linux bridge 资料链接

    1.Performance Evalution of Linux Bridge https://tnt.aufbix.org/_media/linux/yu-linux-tsm2004.pdf 2.L ...

  10. django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE的解决办法(转)

    在python的开发中,遇到了这个错误: django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TA ...