Description

    想必大家都看过成龙大哥的《80天环游世界》,里面的紧张刺激的打斗场面一定给你留下了深刻的印象。现在就有这么
    一个80人的团伙,也想来一次环游世界。
    他们打算兵分多路,游遍每一个国家。
    因为他们主要分布在东方,所以他们只朝西方进军。设从东方到西方的每一个国家的编号依次为1...N。假若第i个人的游历路线为P1、P2......Pk(0≤k≤N),则P1<P2<......<Pk。
    众所周知,中国相当美丽,这样在环游世界时就有很多人经过中国。我们用一个正整数Vi来描述一个国家的吸引程度,Vi值越大表示该国家越有吸引力,同时也表示有且仅
有Vi个人会经过那一个国家。
    为了节省时间,他们打算通过坐飞机来完成环游世界的任务。同时为了省钱,他们希望总的机票费最小。
    明天就要出发了,可是有些人临阵脱逃,最终只剩下了M个人去环游世界。他们想知道最少的总费用,你能告诉他们吗?

Input

第一行两个正整数N,M。
第二行有N个不大于M正整数,分别表示V1,V2......VN。
接下来有N-1行。第i行有N-i个整数,该行的第j个数表示从第i个国家到第i+j个国家的机票费(如果该值等于-1则表示这两个国家间没有通航)。

Output

在第一行输出最少的总费用。

Sample Input

6 3
2 1 3 1 2 1
2 6 8 5 0
8 2 4 1
6 1 0
4 -1
4

Sample Output

27

HINT

1<= N < =100 1<= M <= 79

  1. /*
  2. 有上下界的费用流。
  3. 对于每个点,拆点:
  4. 超级源点向x连一条容量为v[x],费用为0的边;
  5. x'向超级汇点连一条容量为v[x],费用为0的边;
  6. 源点向x连一条容量为inf,费用为0的边;
  7. x'向汇点连一条容量为inf,费用为0的边。
  8. 对于原图一条u->v,费用为w的边:
  9. u'向v连一条容量为inf,费用为w的边。
  10. */
  11. #include<cstdio>
  12. #include<iostream>
  13. #include<queue>
  14. #define N 310
  15. #define M 110000
  16. #define inf 1000000000
  17. using namespace std;
  18. int head[N],dis[N],inq[N],fa[N],n,m,cnt=,SS,TT,S,T,ans;
  19. struct node{int v,f,w,pre;}e[M];
  20. queue<int> q;
  21. void add(int u,int v,int f,int w){
  22. e[++cnt].v=v;e[cnt].f=f;e[cnt].w=w;e[cnt].pre=head[u];head[u]=cnt;
  23. e[++cnt].v=u;e[cnt].f=;e[cnt].w=-w;e[cnt].pre=head[v];head[v]=cnt;
  24. }
  25. bool spfa(){
  26. for(int i=;i<=T;i++) dis[i]=inf;
  27. q.push(S);dis[S]=;
  28. while(!q.empty()){
  29. int u=q.front();q.pop();inq[u]=;
  30. for(int i=head[u];i;i=e[i].pre)
  31. if(e[i].f&&dis[e[i].v]>dis[u]+e[i].w){
  32. dis[e[i].v]=dis[u]+e[i].w;
  33. fa[e[i].v]=i;
  34. if(!inq[e[i].v]){
  35. q.push(e[i].v);
  36. inq[e[i].v]=;
  37. }
  38. }
  39. }
  40. return dis[T]!=inf;
  41. }
  42. void updata(){
  43. int i=fa[T],x=inf;
  44. while(i){
  45. x=min(x,e[i].f);
  46. i=fa[e[i^].v];
  47. }
  48. i=fa[T];
  49. while(i){
  50. e[i].f-=x;
  51. e[i^].f+=x;
  52. i=fa[e[i^].v];
  53. }
  54. ans+=x*dis[T];
  55. }
  56. int main(){
  57. scanf("%d%d",&n,&m);
  58. SS=n*+;TT=n*+;S=n*+;T=n*+;
  59. add(TT,SS,m,);
  60. for(int i=;i<=n;i++){
  61. int x;scanf("%d",&x);
  62. add(S,i+n,x,);
  63. add(i,T,x,);
  64. add(SS,i,inf,);
  65. add(i+n,TT,inf,);
  66. }
  67. for(int i=;i<=n;i++)
  68. for(int j=i+;j<=n;j++){
  69. int x;scanf("%d",&x);
  70. if(x==-) continue;
  71. add(i+n,j,inf,x);
  72. }
  73. while(spfa())
  74. updata();
  75. printf("%d",ans);
  76. return ;
  77. }

80人环游世界(bzoj 2055)的更多相关文章

  1. 【BZOJ】2055 80人环游世界

    [算法]有源汇上下界最小费用可行流 [题解]上下界 因为上下界相同,所以无所谓最小流了,可行流(初始流+附加流)就是答案了. 记得源点向新建节点连一条容量为m(人)的边. bzoj 2055 80人环 ...

  2. BZOJ 2055: 80人环游世界 [上下界费用流]

    2055: 80人环游世界 题意:n个点带权图,选出m条路径,每个点经过val[i]次,求最小花费 建图比较简单 s拆点限制流量m 一个点拆成两个,限制流量val[i],需要用上下界 图中有边的连边, ...

  3. bzoj 2055: 80人环游世界 -- 上下界网络流

    2055: 80人环游世界 Time Limit: 10 Sec  Memory Limit: 64 MB Description     想必大家都看过成龙大哥的<80天环游世界>,里面 ...

  4. 【BZOJ-2055】80人环游世界 上下界费用流 (无源无汇最小费用最大流)

    2055: 80人环游世界 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 321  Solved: 201[Submit][Status][Discus ...

  5. BZOJ2055: 80人环游世界

    题解: 总算A掉了,各种蛋疼... int main() { freopen("input.txt","r",stdin); freopen("out ...

  6. [BZOJ2055]80人环游世界 有上下界最小费用最大流

    2055: 80人环游世界 Time Limit: 10 Sec  Memory Limit: 64 MB Description     想必大家都看过成龙大哥的<80天环游世界>,里面 ...

  7. P4553 80人环游世界

    题目地址:P4553 80人环游世界 上下界网络流 无源汇上下界可行流 给定 \(n\) 个点, \(m\) 条边的网络,求一个可行解,使得边 \((u,v)\) 的流量介于 \([B(u,v),C( ...

  8. 【BZOJ2055】80人环游世界 有上下界费用流

    [BZOJ2055]80人环游世界 Description     想必大家都看过成龙大哥的<80天环游世界>,里面的紧张刺激的打斗场面一定给你留下了深刻的印象.现在就有这么     一个 ...

  9. P4553 80人环游世界(上下界费用流)

    P4553 80人环游世界 emm......先从上下界网络流(转)开始 再到现在的上下界费用流 因为有上下界,我们需要记下每个点的流量差$ex[i]$,用于调整 $ins(x,y,l,r,v)=li ...

随机推荐

  1. Python基础2-Python中文乱码(转)

    转自:https://blog.csdn.net/apache0554/article/details/53889253 前言:中文编码问题一直是程序员头疼的问题,而Python2中的字符编码足矣令新 ...

  2. python 基础 for else

    for one in many_list: if "k" in one: print "在里面" break else: print "没有在里面&q ...

  3. Linux产生随机数的几种方法

    .echo $RANDOM .openssl rand -base64 .date +%n%N .head /dev/urandom |cksum .cat /proc/sys/kernel/rand ...

  4. 【CodeBase】通过层级键在多维数组中获取目标值

    通过层级键在多维数组中获取目标值 /* *Author : @YunGaZeon *Date : 2017.08.09 *param data : Data Array *param keys : K ...

  5. php扩展开发-快速上手

    系统环境CentOS release 6.5 (Final) PHP版本php-5.6.27 扩展开发需要有php环境及php的源代码,我的PHP安装目录/home/zhangxiaomin/stud ...

  6. ThinkPHP邮件发送S(Smtp + Mail + phpmailer)

    三种邮件发送介绍:(Smtp,Mail以及phpmailer)ThinkPhp 框架下开发. 邮件发送配置先前准备(用该账号做测试用):(这里用新浪邮箱服务器)将自己的新浪邮箱开通 POP3/SMTP ...

  7. python3.7 time模块

    #!/usr/bin/env python __author__ = "lrtao2010" #python3.7 time模块 #time模块没有time.py文件,是内置到解释 ...

  8. shell脚本中的交互式输入自动化

    shell中有时我们需要交互,但是呢我们又不想每次从stdin输入,想让其自动化,这时我们就要使shell交互输入自动化了. 1    利用重定向     重定向的方法应该是最简单的 例: 以下的te ...

  9. excel VBA 将文本数值转换为数字格式(单元格中数据左上角是绿三角,鼠标点上有叹号标示)

    Range("A6").SelectSelection.CopyRange("A10:A60").SelectRange(Selection, Selectio ...

  10. Django templates(模板)

    为什么用templates? views.py视图函数是用来写Python代码的,HTML可以被直接硬编码在views.py之中.如下: import datetime def current_tim ...