Bzoj的翻译出锅了所以来官方题面:

这个题应该是单向边而BZOJ说的是双向边,什么你WA了?谁叫你懒得看英文......

显然我们能正向反向两遍SPFA处理出每个点到总部的距离和总部到每个点的距离。
如果某个点所在的部门的大小为S,那么这个点需要送出S-1次消息并接收S-1次消息。
我们把每个点的两个距离求和并排序,显然在一个块中的是这个序列上的一个区间(脑补一下为什么不这样不优),我们做一下前缀和。
然后就开始DP了,f[i][j]表示前i个点分j个块,最小代价。f[i][j] = min( f[k][j-1] + ( i - k - 1 ) * ( sum[i] - sum[k] ) )。
这个DP是O(n^3)的,考虑优化。
显然更小的边权所在的块应该更大,所以我们能从区间[i-(i/j),i-1]枚举k,这样能优化到n^2logn。
然而有更优美的做法:显然随着j增大,对于每个i最优的k也是递增的,直接指针扫过去,复杂度O(n^2)。
两种做法都可以AC,反正我6代i5的机器上时间差异不大,不知道BZOJ能不能卡出来(我只交了第一种)。
(为什么我现在在刷这种水题?我也不知道啊!!!)

第一种代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<queue>
  6. typedef long long int lli;
  7. using namespace std;
  8. const int maxn=5e3+1e2,maxe=5e4+1e2;
  9.  
  10. lli su[maxn],f[][maxn];
  11. int b,s,cur;
  12.  
  13. struct Graph {
  14. int s[maxn],t[maxe],nxt[maxe],l[maxe],dis[maxn],inq[maxn],cnt;
  15. inline void addedge(int from,int to,int len) {
  16. t[++cnt] = to , l[cnt] = len , nxt[cnt] = s[from] , s[from] = cnt;
  17. }
  18. inline void spfa(int st) {
  19. memset(dis,0x3f,sizeof(dis)) , dis[st] = ;
  20. queue<int> q; q.push(st) , inq[st] = ;
  21. while( q.size() ) {
  22. const int pos = q.front(); q.pop() , inq[pos] = ;
  23. for(int at=s[pos];at;at=nxt[at])
  24. if( dis[t[at]] > dis[pos] + l[at] ) {
  25. dis[t[at]] = dis[pos] + l[at];
  26. if( !inq[t[at]] ) q.push(t[at]);
  27. }
  28. }
  29. }
  30. }gra,rev;
  31.  
  32. inline void dp() {
  33. for(int i=;i<=b;i++) su[i] = (lli) gra.dis[i] + rev.dis[i];
  34. sort(su+,su++b) , memset(f,0x3f,sizeof(f)) , **f = ;
  35. for(int i=;i<=b;i++) su[i] += su[i-];
  36. for(int j=;j<=s;j++) { // j is number of groups .
  37. cur ^= , memset(f[cur],0x3f,sizeof(f[]));
  38. for(int i=;i<=b;i++) // i is last node .
  39. for(int lst=i/j;lst;lst--)
  40. f[cur][i] = min( f[cur][i] , f[cur^][i-lst] + ( lst - ) * ( su[i] - su[i-lst] ) );
  41. }
  42. }
  43.  
  44. int main() {
  45. static int n,r;
  46. scanf("%d%d%d%d",&n,&b,&s,&r);
  47. for(int i=,a,b,l;i<=r;i++) scanf("%d%d%d",&a,&b,&l) , gra.addedge(a,b,l) , rev.addedge(b,a,l);
  48. gra.spfa(b+) , rev.spfa(b+) , dp();
  49. printf("%lld\n",f[cur][b]);
  50. return ;
  51. }

第二种代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<queue>
  6. typedef long long int lli;
  7. using namespace std;
  8. const int maxn=5e3+1e2,maxe=5e4+1e2;
  9.  
  10. int tp[maxn];
  11. lli su[maxn],f[][maxn];
  12. int b,s,cur;
  13.  
  14. struct Graph {
  15. int s[maxn],t[maxe],nxt[maxe],l[maxe],dis[maxn],inq[maxn],cnt;
  16. inline void addedge(int from,int to,int len) {
  17. t[++cnt] = to , l[cnt] = len , nxt[cnt] = s[from] , s[from] = cnt;
  18. }
  19. inline void spfa(int st) {
  20. memset(dis,0x3f,sizeof(dis)) , dis[st] = ;
  21. queue<int> q; q.push(st) , inq[st] = ;
  22. while( q.size() ) {
  23. const int pos = q.front(); q.pop() , inq[pos] = ;
  24. for(int at=s[pos];at;at=nxt[at])
  25. if( dis[t[at]] > dis[pos] + l[at] ) {
  26. dis[t[at]] = dis[pos] + l[at];
  27. if( !inq[t[at]] ) q.push(t[at]);
  28. }
  29. }
  30. }
  31. }gra,rev;
  32.  
  33. inline void dp() {
  34. for(int i=;i<=b;i++) su[i] = (lli) gra.dis[i] + rev.dis[i];
  35. sort(su+,su++b) , memset(f,0x3f,sizeof(f)) , **f = ;
  36. for(int i=;i<=b;i++) su[i] += su[i-];
  37. for(int j=;j<=s;j++) { // j is number of groups .
  38. cur ^= , memset(f[cur],0x3f,sizeof(f[]));
  39. for(int i=;i<=b;i++) // i is last node .
  40. for(int lst=tp[i];lst<i;lst++)
  41. if( f[cur][i] >= f[cur^][lst] + ( i - lst - ) * ( su[i] - su[lst] ) ) f[cur][i] = f[cur^][lst] + ( i - lst - ) * ( su[i] - su[lst] ) , tp[i] = lst;
  42. }
  43. }
  44.  
  45. int main() {
  46. static int n,r;
  47. scanf("%d%d%d%d",&n,&b,&s,&r);
  48. for(int i=,a,b,l;i<=r;i++) scanf("%d%d%d",&a,&b,&l) , gra.addedge(a,b,l) , rev.addedge(b,a,l);
  49. gra.spfa(b+) , rev.spfa(b+) , dp();
  50. printf("%lld\n",f[cur][b]);
  51. return ;
  52. }

良心的我给的数据下载:
链接:https://pan.baidu.com/s/19EmgxmCYDASzpTaqr0alkA 密码:00qr

果てないこの闇の向こうにも
在无尽的这黑暗的对面
光があると信じてる
我相信也存在光明
ここから生まれ変わる世界だけ
从此只盯住这脱胎换骨的世界
见つめて离さないよ
目不转睛
広がるこの空を见上げると
仰望这广袤的天空
あの日の戦いが映る
那一日的决战映在脑海
いつかは全て消えてしまうのか
终有一天一切将会消失
栄光を取り戻せ
重新夺回这荣光

4609: [Wf2016]Branch Assignment 最短路 DP (阅读理解题)的更多相关文章

  1. Gym - 101611D Decoding of Varints(阅读理解题 )

    Decoding of Varints ​ 题意&思路: 首先根据红色边框部分的公式算出x,再有绿色部分得知,如果x是偶数则直接除以2,x是奇数则(x+1)/-2. PS:这题有数据会爆掉un ...

  2. 阅读关于DuReader:百度大规模的中文机器阅读理解数据集

    很久之前就得到了百度机器阅读理解关于数据集的这篇文章,今天才进行总结!.... 论文地址:https://arxiv.org/abs/1711.05073 自然语言处理是人工智能皇冠上的明珠,而机器阅 ...

  3. BZOJ_4609_[Wf2016]Branch Assignment_决策单调性+带权二分

    BZOJ_4609_[Wf2016]Branch Assignment_决策单调性+带权二分 Description 要完成一个由s个子项目组成的项目,给b(b>=s)个部门分配,从而把b个部门 ...

  4. hdu 4568 Hunter 最短路+dp

    Hunter Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  5. BZOJ_1003_[ZJOI2006]物流运输_最短路+dp

    BZOJ_1003_[ZJOI2006]物流运输_最短路+dp 题意:http://www.lydsy.com/JudgeOnline/problem.php?id=1003 分析: 这种一段一段的显 ...

  6. POJ 3635 Full Tank? 【分层图/最短路dp】

    任意门:http://poj.org/problem?id=3635 Full Tank? Time Limit: 1000MS   Memory Limit: 65536K Total Submis ...

  7. [USACO07NOV]牛继电器Cow Relays (最短路,DP)

    题目链接 Solution 非正解 似乎比较蛇啊,先个一个部分分做法,最短路+\(DP\). 在求最短路的堆或者队列中存储元素 \(dis_{i,j}\) 代表 \(i\) 这个节点,走了 \(j\) ...

  8. P1772 [ZJOI2006]物流运输 最短路+DP

    思路:最短路+DP 提交:1次 题解: $f[i]$表示到第$i$天的最小代价,我们可以预先处理出$i,j$两天之间(包括$i,j$)都可通行的最短路的代价记做$s[i][j]$,然后有$f[i]=m ...

  9. bzoj1003物流运输 最短路+DP

    bzoj1003物流运输 题目描述 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输 ...

随机推荐

  1. 【vim】跳转到上/下一个修改的位置

    当你编辑一个很大的文件时,经常要做的事是在某处进行修改,然后跳到另外一处.如果你想跳回之前修改的地方,使用命令: Ctrl+o 来回到之前修改的地方 类似的: Ctrl+i 会回退上面的跳动.

  2. 同步阿里云镜像到本地,在本地搭建YUM仓库

    1.下载阿里云镜像repo文件 项目使用CentOS6系统,因此我下载的文件是: # CentOS-Base.repo # # The mirror system uses the connectin ...

  3. Elastic-Job-Lite分析——作业调度器 JobScheduler 的创建过程

    -----------------------------------1. 创建注册中心的对象----------------------------------------------------- ...

  4. mysql系列一、mysql数据库规范

    一. 表设计 库名.表名.字段名必须使用小写字母,“_”分割. 库名.表名.字段名必须不超过12个字符. 库名.表名.字段名见名知意,建议使用名词而不是动词. 表必须使用InnoDB存储引擎. 表必须 ...

  5. Python3学习笔记13-函数的参数

    定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了.对于函数的调用者来说,只需要知道如何传递正确的参数, 以及函数将返回什么样的值就够了,函数内部的复杂逻辑被封装起来,调用者无需了 ...

  6. mysql5.5.48的my.cnf配置

    MYSQL配置 [client] port = 3306 socket = /tmp/mysql.sock [mysqld] port = 3306 default-storage-engine=My ...

  7. Ex 6_16 旧货销售问题_第七次作业

    即可 子问题定义:定义数组B(S,j),其中 B(S,j)表示在子集S中结束位置为j的子问题的最大收益值,其中j的前一个地点有两种情况,第一种情况是某个拍卖会 另一种情况是从家里出发. 递归关系: 初 ...

  8. transfer pdf to png

    #! /bin/bash # # transfer pdf to png if [ $# != 1 ] ; then echo "USAGE: $0 PDF FILE ABSOLUTELY ...

  9. vue系列之webstrom开发vue,无法热更新

    用vue-cli构建了项目之后在webstorm开发,用npm run dev跑本地服务,经常修改之后在浏览器刷新没反应,偶尔才会有刷新,需要重新跑一遍npm run dev才会更新,这是怎么回事呢? ...

  10. 微信HTML5页面设计建议

    一个HTML5页面从提出到完成上线的流程:>   1.需求方.设计人员.H5实现人员三方共同讨论实现方案 2.设计人员出设计图 3.H5人员按设计图出H5页面 4.需求方评估已实现的H5页面后给 ...