题目描述

可可和卡卡家住合肥市的东郊,每天上学他们都要转车多次才能到达市区西端的学校。直到有一天他们两人参加了学校的信息学奥林匹克竞赛小组才发现每天上学的乘车路线不一定是最优的。 可可:“很可能我们在上学的路途上浪费了大量的时间,让我们写一个程序来计算上学需要的最少时间吧!” 合肥市一共设有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[];
int dis[][],num=;
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=;i<=n;i++) dis[i][i]=;
for(int k=;k<=n;k++)
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
} struct Edge_flow{
int next,to,flow;
}e[];
int cnt=,head[]={};
inline void add(int u,int v,int c)
{
e[cnt]={head[u],v,c};
head[u]=cnt++;
e[cnt]={head[v],u,};
head[v]=cnt++;
} int dep[]={};
bool bfs()
{
memset(dep,,sizeof(dep));
queue<int> q;
dep[]=;
q.push();
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]+;
q.push(v);
}
}
}
return dep[n]!=;
} int dfs(int u,int f)
{
if(u==n||f==) return f;
int sum=;
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].to;
if(dep[v]==dep[u]+&&e[i].flow)
{
int delta=dfs(v,min(f-sum,e[i].flow));
sum+=delta;
e[i].flow-=delta;
e[i^].flow+=delta;
if(f-sum<=) break;
}
}
if(!sum) dep[u]=-;
return sum;
}
int main()
{
scanf("%d%d",&n,&m);
memset(dis,0x3f,sizeof(dis));
memset(g,-,sizeof(-));
for(int i=,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[][n]);
for(int i=;i<=m;i++)
{
int u=g[i].u,v=g[i].v,w=g[i].w,c=g[i].c;
if(dis[][u]+w+dis[v][n]==dis[][n]) add(u,v,c);
if(dis[][v]+w+dis[u][n]==dis[][n]) add(v,u,c);//如果这条边在最短路上,就加到最短路图中
}
int ans=;
while(bfs())
{
while(int temp=dfs(,0x7fffffff))
ans+=temp;
}
printf("%d\n",ans); return ;
}

洛谷 P4300 BZOJ 1266 [AHOI2006]上学路线route的更多相关文章

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

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

  2. bzoj 1266 [AHOI2006] 上学路线 route 题解

    转载请注明:http://blog.csdn.net/jiangshibiao/article/details/23989499 [原题] 1266: [AHOI2006]上学路线route Time ...

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

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

  4. BZOJ 1266: [AHOI2006]上学路线route Floyd_最小割

    十分简单的一道题. 图这么小,跑一边 Floyd 就得到第一问最短路径的答案. 考虑第二问怎么求:我们可以先将最短路径组成的图从原图中抽离出来,构成新图 $G$. 我们发现,只要 $G$ 的起点与终点 ...

  5. bzoj 1266 1266: [AHOI2006]上学路线route

    1266: [AHOI2006]上学路线route Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 2356  Solved: 841[Submit][S ...

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

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1266 分析: 很简单的题目,容易想到就是把所有的最短路径挑出来,然后在这个图里跑最小割 ...

  7. bzoj 1266 [AHOI2006] 上学路线

    传送门 传说中的经典容斥+卢卡斯定理+中国剩余定理 题解传送门 //Achen #include<algorithm> #include<iostream> #include& ...

  8. bzoj1266 [AHOI2006]上学路线route floyd建出最短路图+最小割

    1266: [AHOI2006]上学路线route Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 2490  Solved: 898[Submit][S ...

  9. bzoj1266 [AHOI2006]上学路线route floyd+最小割

    1266: [AHOI2006]上学路线route Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 2490  Solved: 898[Submit][S ...

随机推荐

  1. Postman + Newman 生成测试报告

    1.安装Node.js 下载地址: https://nodejs.org/download/ 2.安装Newman 1) 打开cmd,输入:npm install -g newman 2) 安装支持N ...

  2. 【ABAP系列】SAP ABAP诠释BDC的OK CODE含义

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP诠释BDC的OK ...

  3. linux下mysql 5.7编写存储过程一直报错说Mysql server version for the right syntax

    首先看下可以正确执行的. 再来看保存时提示出错的 我唯一的区别就是在传参的类型那里有了变化,然而,报错如下 难道是我的类型不支持了吗,最后在一个无意识操作下,直接在类型里面限定长度. 可以运行啦.经过 ...

  4. JS和C#后台获取网站URL

    例:网页URL :  http://localhost:8086/index.aspx?topicId=361 1.设置或获取 href 属性中跟在问号后面的部分:window.location.se ...

  5. Linux基础:Linux环境下安装JDK

    title: Linux基础:JDK的及环境变量配置 author: Enjoyitlife.top date: 2019-10-09 20:50:36 tags: Linux JDK categor ...

  6. [19/05/26-星期日] JavaScript_ 基本语法_运算符

    一.概念 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <titl ...

  7. SpringBoot(五) -- SpringBootWeb登录示例

    一.解决index.html访问 在SpringBoot中默认访问的首页是静态资源文件夹下的index.html,无法被Thymeleaf模板引擎解析,因此我们可以定义一个controller将默认请 ...

  8. [luogu4768] [NOI2018] 归程 (Dijkstra+Kruskal重构树)

    [luogu4768] [NOI2018] 归程 (Dijkstra+Kruskal重构树) 题面 题面较长,这里就不贴了 分析 看到不能经过有积水的边,即不能经过边权小于一定值的边,我们想到了kru ...

  9. [集合]List

    List 存取有序,有索引,可以重复 ArrayList去除集合中字符串的重复值(字符串的内容相同) public static void main(String[] args) { ArrayLis ...

  10. MS COCO 数据集学习笔记(Common Objects in COntext)

    一.数据来源 COCO中图片资源均引用自Flickr图片网站 二.数据集创建目的 进行图像识别训练,主要针对以下三个方向: (1)object instances (2)object keypoint ...