洛谷 P4300 BZOJ 1266 [AHOI2006]上学路线route
题目描述
输入
输出
样例输入
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
样例输出
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的更多相关文章
- BZOJ 1266: [AHOI2006]上学路线route(最短路+最小割)
第一问最短路.第二问,先把最短路的图建出来(边(u,v)满足d[s->u]+d[v->t]+d(u,v)==最短路径长度,就在图中,可以从源点和汇点分别跑一次最短路得到每个点到源点和汇点的 ...
- bzoj 1266 [AHOI2006] 上学路线 route 题解
转载请注明:http://blog.csdn.net/jiangshibiao/article/details/23989499 [原题] 1266: [AHOI2006]上学路线route Time ...
- BZOJ 1266: [AHOI2006]上学路线route
题目描述 可可和卡卡家住合肥市的东郊,每天上学他们都要转车多次才能到达市区西端的学校.直到有一天他们两人参加了学校的信息学奥林匹克竞赛小组才发现每天上学的乘车路线不一定是最优的. 可可:"很 ...
- BZOJ 1266: [AHOI2006]上学路线route Floyd_最小割
十分简单的一道题. 图这么小,跑一边 Floyd 就得到第一问最短路径的答案. 考虑第二问怎么求:我们可以先将最短路径组成的图从原图中抽离出来,构成新图 $G$. 我们发现,只要 $G$ 的起点与终点 ...
- bzoj 1266 1266: [AHOI2006]上学路线route
1266: [AHOI2006]上学路线route Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 2356 Solved: 841[Submit][S ...
- [BZOJ 1266][AHOI2006]上学路线(最短路+最小割)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1266 分析: 很简单的题目,容易想到就是把所有的最短路径挑出来,然后在这个图里跑最小割 ...
- bzoj 1266 [AHOI2006] 上学路线
传送门 传说中的经典容斥+卢卡斯定理+中国剩余定理 题解传送门 //Achen #include<algorithm> #include<iostream> #include& ...
- bzoj1266 [AHOI2006]上学路线route floyd建出最短路图+最小割
1266: [AHOI2006]上学路线route Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 2490 Solved: 898[Submit][S ...
- bzoj1266 [AHOI2006]上学路线route floyd+最小割
1266: [AHOI2006]上学路线route Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 2490 Solved: 898[Submit][S ...
随机推荐
- phpmyadmin和网页上面的乱码问题
前段时间做了个留言板,但是总是出现乱码,而且出现了无法插入的情况:发现这么个问题:在phpmyadmin里面默认的编码是瑞士的一个编码:我就郁闷了为什么这么一个通用软件的编码放着UTF-8或者是GBK ...
- 阿里云SLB产品HTTP、HTTPS、UDP协议使用
1.http协议测试 第一步:添加http监听服务,前端端口为8080,后端端口为80,健康检查中检查端口为后端端口80: 第二步:在绑定的服务器上安装服务,步骤如下 centos系统中启动http协 ...
- 【ABAP系列】SAP ABAP的事件执行顺序
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP的事件执行顺序 ...
- 000 (H5*) 常见代码
目录: 1:HTML 1:块级元素(block-level) 2:行内元素(inline-level) 3:行内块元素(inline-block) 4: img标签 5:表单元素 6:自定义列表 d ...
- python基础-6 正则表达式
一 python正则简介 就其本质而言,正则表达式(或 RE)是一种小型的.高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现. 正则表达式模式被编译成一系列的字 ...
- Docker中使用多阶段Dockerfile构建容器镜像image(镜像优化)
使用多阶段构建 预计阅读时间: 6分钟 多阶段构建是守护程序和客户端上需要Docker 17.05或更高版本的新功能.多阶段构建对于那些努力优化Dockerfiles同时使其易于阅读和维护的人来说非常 ...
- [19/05/19-星期日] CSS_css的声明和选择器
一.引言 HTML的作用是负责数据的格式展示,如果使用它来搞数据的样式,则发现样式书写出来太麻烦,不易于维护: HTML可以有效组织数据的展示,但是不同类型数据在浏览器中的分布没有办法展示. HTML ...
- 全球编程语言薪资排行榜,Java竟然垫底!!!
近日,Stack Overflow 发布了 2019 年度开发者调查报告,这次调查有来自全球的几乎将近 90000 名开发者参与,是对世界各地开发人员进行的规模最大,最全面的调查. 这次调查报告中总结 ...
- OSI模型——传输层
OSI模型——传输层 运输层 运输层概述 运输层提供应用层端到端通信服务,通俗的讲,两个主机通讯,也就是应用层上的进程之间的通信,也就是转换为进程和进程之间的通信了,我们之前学到网络层,IP协议能将分 ...
- P1522 牛的旅行 (Floyd)
[题目描述] 请编程找出一条连接两个不同牧场的路径,使得连上这条路径后,这个更大的新牧场有最小的直径.输出在所有牧场中最小的可能的直径. [题目链接] https://www.luogu.org/pr ...