题目描述

可可和卡卡家住合肥市的东郊,每天上学他们都要转车多次才能到达市区西端的学校。直到有一天他们两人参加了学校的信息学奥林匹克竞赛小组才发现每天上学的乘车路线不一定是最优的。 可可:“很可能我们在上学的路途上浪费了大量的时间,让我们写一个程序来计算上学需要的最少时间吧!” 合肥市一共设有N个公交车站,不妨将它们编号为1…N的自然数,并认为可可和卡卡家住在1号汽车站附近,而他们学校在N号汽车站。市内有M条直达汽车路线,执行第i条路线的公交车往返于站点pi和qi之间,从起点到终点需要花费的时间为ti。(1<=i<=M, 1<=pi, qi<=N) 两个人坐在电脑前,根据上面的信息很快就编程算出了最优的乘车方案。然而可可忽然有了一个鬼点子,他想趁卡卡不备,在卡卡的输入数据中删去一些路线,从而让卡卡的程序得出的答案大于实际的最短时间。而对于每一条路线i事实上都有一个代价ci:删去路线的ci越大卡卡就越容易发现这个玩笑,可可想知道什么样的删除方案可以达到他的目的而让被删除的公交车路线ci之和最小。 [任务] 编写一个程序:  从输入文件中读取合肥市公交路线的信息;  计算出实际上可可和卡卡上学需要花费的最少时间;  帮助可可设计一个方案,删除输入信息中的一些公交路线,使得删除后从家到学校需要的最少时间变大,而被删除路线的ci和最小;向输出文件输出答案。

输入

输入文件中第一行有两个正整数N和M,分别表示合肥市公交车站和公交汽车路线的个数。以下M行,每行(第i行,总第(i+1)行)用四个正整数描述第i条路线:pi, qi, ti, ci;具体含义见上文描述。

输出

输出文件最多有两行。 第一行中仅有一个整数,表示从可可和卡卡家到学校需要的最短时间。 第二行输出一个整数C,表示Ci之和

样例输入

6 7
1 2 1 3
2 6 1 5
1 3 1 1
3 4 1 1
4 6 1 1
5 6 1 2
1 5 1 4

样例输出

2
5

提示

2<=N<=500, 1<=M<=124 750, 1<=ti, ci<=10 000
合肥市的公交网络十分发达,你可以认为任意两个车站间都可以通过直达或转车互相到达,当然如果在你提供的删除方案中,家和学校无法互相到达,那么则认为上学需要的最短为正无穷大:这显然是一个合法的方案。

吐槽

  这题各种单向边双向边变来变去,一会单向,一会双向,一会又单向添加两次,各种乱七八糟的,把我自己绕晕了。只是粗浅地搞懂原理,却没真正理解题目意思和解法真的不好啊!

解题思路

  第一问单源最短路,才500个点,随便乱搞套各种模板的节奏,这里我选择了代码量极短的Floyd(后面求最小割即最大流时加边比spfa更方便)。

  然后第二问,要把所有最短路径都切断,那么我们用Floyd或其他spfa什么的跑出所有最短路构成的图,每条边的切割代价为c,那么求一波这个图的最小割,就是答案了(好像BZOJ 1002 狼抓兔子啊)。由于最小割等于最大流,所以我们在最短路图上跑最大流算法即可,这里我用的Dinic,蒟蒻版几乎无优化。

源代码

#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m;struct Edge_road{int u,v,w,c;
}g[130000];
int dis[510][510],num=1;
inline void addg(int u,int v,int w,int c)
{g[num++]={u,v,w,c};//不排序的前向星,只加单向边dis[u][v]=dis[v][u]=min(dis[u][v],w);//dis数组用来跑floyd,加双向边,有重边则选最小边长的一条边
}
inline void floyd()
{for(int i=1;i<=n;i++) dis[i][i]=0;for(int k=1;k<=n;k++)for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
}struct Edge_flow{int next,to,flow;
}e[300010];
int cnt=2,head[510]={0};
inline void add(int u,int v,int c)
{e[cnt]={head[u],v,c};head[u]=cnt++;e[cnt]={head[v],u,0};head[v]=cnt++;
}int dep[510]={0};
bool bfs()
{memset(dep,0,sizeof(dep));queue<int> q;dep[1]=1;q.push(1);while(!q.empty()){int u=q.front();q.pop();for(int i=head[u];i;i=e[i].next){int v=e[i].to;if(!dep[v]&&e[i].flow){dep[v]=dep[u]+1;q.push(v);}}}return dep[n]!=0;
}int dfs(int u,int f)
{if(u==n||f==0) return f;int sum=0;for(int i=head[u];i;i=e[i].next){int v=e[i].to;if(dep[v]==dep[u]+1&&e[i].flow){int delta=dfs(v,min(f-sum,e[i].flow));sum+=delta;e[i].flow-=delta;e[i^1].flow+=delta;if(f-sum<=0) break;}}if(!sum) dep[u]=-1;return sum;
}
int main()
{scanf("%d%d",&n,&m);memset(dis,0x3f,sizeof(dis));memset(g,-1,sizeof(-1));for(int i=1,u,v,w,c;i<=m;i++){scanf("%d%d%d%d",&u,&v,&w,&c);addg(u,v,w,c);}floyd();printf("%d\n",dis[1][n]);for(int i=1;i<=m;i++){int u=g[i].u,v=g[i].v,w=g[i].w,c=g[i].c;if(dis[1][u]+w+dis[v][n]==dis[1][n]) add(u,v,c);if(dis[1][v]+w+dis[u][n]==dis[1][n]) add(v,u,c);//如果这条边在最短路上,就加到最短路图中}int ans=0;while(bfs()){while(int temp=dfs(1,0x7fffffff))ans+=temp;}printf("%d\n",ans);return 0;
}

转载于:https://www.cnblogs.com/wawcac-blog/p/7012556.html

洛谷 P4300 BZOJ 1266 [AHOI2006]上学路线route相关推荐

  1. BZOJ 1266: [AHOI2006]上学路线route Floyd算法,网络最小割

    Description 可可和卡卡家住合肥市的东郊,每天上学他们都要转车多次才能到达市区西端的学校.直到有一天他们两人参加了学校的信息学奥林匹克竞赛小组才发现每天上学的乘车路线不一定是最优的. 可可: ...

  2. BZOJ 1266: [AHOI2006]上学路线route

    Description 可可和卡卡家住合肥市的东郊,每天上学他们都要转车多次才能到达市区西端的学校.直到有一天他们两人参加了学校的信息学奥林匹克竞赛小组才发现每天上学的乘车路线不一定是最优的. 可可: ...

  3. 1266: [AHOI2006]上学路线route

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

  4. 【BZOJ 1266】 [AHOI2006]上学路线route

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 第一问是个最短路. 第二问. 利用第一问floyd算出来的任意两点之间的最短路. 那么枚举每一条边(x,y) 如果w[1][x]+c ...

  5. bzoj1266: [AHOI2006]上学路线route

    最短路+最小割 首先如何使最短路变长?就是要每一条最短路都割一条边. 我们求出每个点到点1和点n的距离,就可以知道哪些边在最短路上(一开始没有想到求到0和n的距离,想用floyd,但是n=500,怕超 ...

  6. bzoj1266【AHOI2006】上学路线route

    1266: [AHOI2006]上学路线route Time Limit: 3 Sec   Memory Limit: 162 MB Submit: 1602   Solved: 559 [ Subm ...

  7. 洛谷 P4151 BZOJ 2115 [WC2011]最大XOR和路径

    //bzoj上的题面太丑了,导致VJ的题面也很丑,于是这题用洛谷的题面 题面描述 XOR(异或)是一种二元逻辑运算,其运算结果当且仅当两个输入的布尔值不相等时才为真,否则为假. XOR 运算的真值表如 ...

  8. 洛谷 P2046 BZOJ 2007 海拔(NOI2010)

    题目描述 YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域.简单起见,可以将YT市看作 一个正方形,每一个区域也可看作一个正方形.从而,YT城市中包括(n+1)×(n+1)个 ...

  9. 洛谷 P4175: bzoj 1146: [CTSC2008]网络管理

    令人抓狂的整体二分题.根本原因还是我太菜了. 在学校写了一个下午写得头晕,回家里重写了一遍,一个小时就写完了--不过还是太慢. 题目传送门:洛谷P4175. 题意简述: 一棵 \(n\) 个结点的树, ...

最新文章

  1. nginx下启动php-fpm相关错误信息集锦(长期补充)
  2. 树莓派linux系统识别u盘启动,树莓派Raspberry Pi实战之命令行下实现USB存储设备自动挂载...
  3. 上海广电电气集团选用Ultimus 提升企业管理
  4. hdu 1565 方格取数(1)
  5. knn 邻居数量k的选取_选择K个最近的邻居
  6. win7连接sftp_SFTP远程连接服务器上传下载文件-vs2013项目实例
  7. STM32项目(四)——暗室网关
  8. 《C++ Primer Plus(第六版)》(11)(第八章 函数探幽 复习题答案)
  9. VS error C2471: 无法更新程序数据库vc90.pdb的解决办法
  10. rms 公式 有效值_有效值、真有效值、基波有效值、全有效值概念辨析
  11. 网页几种保存类型与html文件格式,HTML 网页文件保存的格式为html或htm (5.0分)
  12. Tesseract-OCR识别中文与训练字库实例(转)
  13. html提取正文字游戏名,游戏id古诗词 用古诗词取个游戏名字
  14. 浅谈利用javascript实现gb2312编码。
  15. Volkswagen profit roars back two yea iot L?sungen rs after 'dieselgate'
  16. Generative Adversarial Networks in Computer Vision: A Survey and Taxonomy(计算机视觉中的GANs:综述与分类)
  17. 如何修复手机里的m4a格式录音文件
  18. Mysql Data types in summary.
  19. Ethical.Hacking.2021.10:CRAFTING TCP SHELLS AND BOTNETS(2)
  20. 表单打印html代码,Html表格代码实现打印

热门文章

  1. POJ3070:Fibonacci——题解
  2. zabbix_appliace 3.4安装部署
  3. nginx+lua+redis deny ip
  4. 不同浏览器对回车提交表单的处理办法(转载)
  5. (转) Twisted 第四部分: 由Twisted支持的诗歌客户端
  6. Hibernate,Session清理缓存时间点
  7. uilabel自动换行
  8. 关于ORM和存储过程的一些看法
  9. React中refs的理解
  10. Mybatis 原始Dao层开发