题意:给定一个无向图,删除某些边有一定的代价,要求删掉使得最短路径减小,求最小代价。

首先要spfa求出起点到各个点的最短距离。对于一条权值为w,起点为i,终点为j的边,设dis[k]为起点到k点的距离,若dis[j]=dis[i]+w,则将该边加入另一个图里,边的容量为删除这条边的代价,则从起点到终点的最大流即为答案。

代码:

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<queue>
  5. using namespace std;
  6. const int inf=0x3fffffff;
  7. const int Maxn=1100000;
  8. int to[Maxn],nxt[Maxn],first[Maxn],t[Maxn],c[Maxn];
  9. int w[Maxn],too[Maxn],nxtt[Maxn],firstt[Maxn];
  10. int n,m,ti,co,u,v,tot=1,e[Maxn];
  11. int b[Maxn],cur[Maxn],dis[Maxn];
  12. inline void add(int u,int v,int ti,int co) {
  13. to[tot]=v;
  14. nxt[tot]=first[u];
  15. t[tot]=ti;
  16. c[tot]=co;
  17. first[u]=tot++;
  18. }
  19. inline void add(int u,int v,int wi) {
  20. too[tot]=v;
  21. w[tot]=wi;
  22. nxtt[tot]=firstt[u];
  23. firstt[u]=tot++;
  24. }
  25. void spfa() {
  26. queue<int>q;
  27. memset(dis,0x3f,sizeof(dis));
  28. memset(e,0,sizeof(e));
  29. q.push(1);
  30. dis[1]=0;
  31. while(!q.empty()) {
  32. int now=q.front();
  33. q.pop();
  34. e[now]=0;
  35. for(int i=first[now];i;i=nxt[i])
  36. if(dis[to[i]]>dis[now]+t[i]) {
  37. dis[to[i]]=dis[now]+t[i];
  38. if(e[to[i]]==0) {
  39. q.push(to[i]);
  40. e[to[i]]=1;
  41. }
  42. }
  43. }
  44. }
  45. bool bfs() {
  46. queue<int>q;
  47. q.push(1);
  48. memset(b,0,sizeof(b));
  49. b[1]=1;
  50. while(!q.empty()) {
  51. int now=q.front();
  52. q.pop();
  53. for(int i=firstt[now];i;i=nxtt[i])
  54. if(w[i]&&b[too[i]]==0) {
  55. b[too[i]]=b[now]+1;
  56. q.push(too[i]);
  57. }
  58. }
  59. return b[n];
  60. }
  61. int dfs(int root,int flow) {
  62. if(root==n) return flow;
  63. for(int &i=cur[root];i;i=nxtt[i])
  64. if(b[too[i]]==b[root]+1&&w[i]) {
  65. int temp=dfs(too[i],min(w[i],flow));
  66. if(temp) {
  67. w[i]-=temp;
  68. w[i^1]+=temp;
  69. return temp;
  70. }
  71. }
  72. return 0;
  73. }
  74. int dinic() {
  75. int ans=0,temp;
  76. while(bfs()) {
  77. memcpy(cur,firstt,sizeof(cur));
  78. while(temp=dfs(1,inf))
  79. ans+=temp;
  80. }
  81. return ans;
  82. }
  83. int main() {
  84. // freopen("test.in","r",stdin);
  85. scanf("%d%d",&n,&m);
  86. for(int i=1;i<=m;i++) {
  87. scanf("%d%d%d%d",&u,&v,&ti,&co);
  88. add(u,v,ti,co);
  89. add(v,u,ti,co);
  90. }
  91. spfa();
  92. tot=2;
  93. for(int i=1;i<=n;i++)
  94. for(int j=first[i];j;j=nxt[j])
  95. if(dis[to[j]]==dis[i]+t[j]) {
  96. add(i,to[j],c[j]);
  97. add(to[j],i,0);
  98. }
  99. printf("%d\n%d\n",dis[n],dinic());
  100. return 0;
  101. }

[AHOI2008]上学路线的更多相关文章

  1. codevs2693 上学路线(施工)

    难度等级:黄金 2693 上学路线(施工) 题目描述 Description 问题描述 你所在的城市街道好像一个棋盘,有a条南北方向的街道和b条东西方向的街道. 南北方向a条街道从西到东依次编号为1到 ...

  2. BZOJ 1266: [AHOI2006]上学路线route(最短路+最小割)

    第一问最短路.第二问,先把最短路的图建出来(边(u,v)满足d[s->u]+d[v->t]+d(u,v)==最短路径长度,就在图中,可以从源点和汇点分别跑一次最短路得到每个点到源点和汇点的 ...

  3. BZOJ 3782: 上学路线 [Lucas定理 DP]

    3782: 上学路线 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 192  Solved: 75[Submit][Status][Discuss] ...

  4. BZOJ_1266_[AHOI2006]上学路线route_最小割

    BZOJ_1266_[AHOI2006]上学路线route_最小割 Description 可可和卡卡家住合肥市的东郊,每天上学他们都要转车多次才能到达市区西端的学校.直到有一天他们两人参加了学校的信 ...

  5. 【最短路+最大流】上学路线@安徽OI2006

    目录 [最短路+最大流]上学路线@安徽OI2006 PROBLEM SOLUTION CODE [最短路+最大流]上学路线@安徽OI2006 PROBLEM 洛谷P4300 SOLUTION 先在原图 ...

  6. BJWC2018上学路线

    题目描述 小B 所在的城市的道路构成了一个方形网格,它的西南角为(0,0),东北角为(N,M). 小B 家住在西南角,学校在东北角.现在有T 个路口进行施工,小B 不能通过这些路口.小B 喜欢走最短的 ...

  7. 洛谷 P4478 [BJWC2018]上学路线

    洛谷 P4478 [BJWC2018]上学路线 原题 神仙题orz,竟然没有1A....容斥+卢卡斯+crt?? 首先用容斥做,记\(f[i][0/1]\)表示到i号点经过了奇数/偶数个点的方案数,因 ...

  8. 洛谷——P1958 上学路线_NOI导刊2009普及(6)

    P1958 上学路线_NOI导刊2009普及(6) 题目描述 你所在城市的街道好像一个棋盘,有a条南北方向的街道和b条东西方向的街道.南北方向的a条街道从西到东依次编号为l到a,而东西方向的b条街道从 ...

  9. 【BZOJ1266】[AHOI2006]上学路线route Floyd+最小割

    [BZOJ1266][AHOI2006]上学路线route Description 可可和卡卡家住合肥市的东郊,每天上学他们都要转车多次才能到达市区西端的学校.直到有一天他们两人参加了学校的信息学奥林 ...

随机推荐

  1. WEB安全第三篇--控制请求的艺术:CSRF和SSRF

    零.前言 最近做专心web安全有一段时间了,但是目测后面的活会有些复杂,涉及到更多的中间件.底层安全.漏洞研究与安全建设等越来越复杂的东东,所以在这里想写一个系列关于web安全基础以及一些讨巧的pay ...

  2. fabric入门

    author: headsen  chen date: 2018-08-12  23:13:16 1,安装 yum -y install epel-releaseyum -y install fabr ...

  3. ios 图片拉伸不变形的方法

    如果一个椭圆图片,原图大小为30*30,而我们让它显示100*30,那么这个图片就会被拉伸,而且效果很难看.用下边的方法可以创建一个局部不被拉伸的图片. UIImage * buttonBg = [[ ...

  4. CRM - 销售与客户

    一.销售与客户 - 表结构 ---公共客户(公共资源) 1.没有报名 2.3天没有跟进 3.15天没有成单 客户分布表 龙泰 男 yuan 2018-5-1 3天未跟进 龙泰 男 三江 2018-5- ...

  5. vue.js(四)

    由于组件内容太多又特别关键,我决定在官网教程的基础上,加上自己的理解,针对每个内容详细记录一下  1.注册组件 ①全局注册 //首先创建组件 Vue.component('blog-post', { ...

  6. Python并行编程(十二):进程同步

    1.基本概念 多个进程可以协同工作来完成一项任务,通常需要共享数据.所以在多进程之间保持数据的一致性就很重要,需要共享数据协同的进程必须以适当的策略来读写数据.同步原语和线程的库类似. - Lock: ...

  7. python中读取配置文件的方式

    方式1:argparse argparse,是Python标准库中推荐使用的编写命令行程序的工具.也可以用于读取配置文件. 字典样式的配置文件*.conf 配置文件test1.conf { " ...

  8. android 控件加圆角

    1.新建一个radius_border.xml <shape xmlns:android="http://schemas.android.com/apk/res/android&quo ...

  9. XShell已经内置rz 直接从Windows拖文件进去终端

    XShell已经内置rz 直接从Windows拖文件进去终端 http://www.jb51.net/LINUXjishu/163820.html 借助securtCRT,使用linux命令sz可以很 ...

  10. soapUI-DataSource

    1.1.1.1 概述 - 数据源   Option Description   Properties DataSource属性表   Toolbar DataSource工具栏   Configura ...