洛谷 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 ...
随机推荐
- Numpy的补充(重要!!)
轴的概念 英文解释 https://www.sharpsightlabs.com/blog/numpy-axes-explained/ 汉化解释 https://www.jianshu.com/p/ ...
- 类StringBuffer
1字符串声明和创建 public StringBuffer() 无参构造函数 public StringBuffer(int capacity) 指定容量的字符串缓冲区对象 public String ...
- beego 注解路由无效问题分析
问题描述:学习 beego 框架发现注解路由无效,除了不能找到路由外,未见任何异常. 问题解决:将配置文件中的 runmode 更改为 dev 模式. 问题分析: 如果没有设置过 runmode 不会 ...
- vts测试流程
测试前提: 1.发货user版本 2.selinux:Enable 3.连接ADB,stay awake 4.烧录XXX申请的key 5.外网环境(ipv6) ATV9测试准备(正常准备环境+fast ...
- hacker101教学笔记--introduction--the web in depth
hacker101笔记 提前准备:运行java的环境 burp proxy(代理) firefox(浏览器) xss 可以控制参数,发送JavaScript到服务器,再从服务器反映到浏览器上面< ...
- “希希敬敬对”团队--‘百度贴吧小爬虫’Alpha版本展示博客
希希敬敬对的 Alpha阶段测试报告 随笔链接地址 https://www.cnblogs.com/xiaoyoushang/p/10078826.html Alpha版本发布说明 随笔链接地址 ...
- Java-多线程第四篇线程池
1.什么是线程池. 线程池在系统启动的时候即创建大量的空闲的线程,程序将一个Runnable对象或者Callable对象传给线程池,线程池就会启动一个线程来执行它们的run()或者call()方法,当 ...
- ./configure 配置文件时出错checking for g++... no
checking for g++... no checking for c++... no checking for gpp... no checking for aCC... no 缺少C++编译器 ...
- CSRF verification failed. Request aborted.错误解决办法
在Django项目的页面,提交form表单POST请求时,会出现报错:CSRF verification failed. Request aborted. 需要在form表单中加:{% csrf_to ...
- 【摘】sizeof实现
注意sizeof是运算符,而非函数 关于sizeof的两个精巧的宏实现. 非数组的sizeof: #defne _sizeof(T) ( (size_t)((T*)0 + 1)) 数组的sizeof: ...