bzoj 1266 [AHOI2006] 上学路线 route 题解
转载请注明:http://blog.csdn.net/jiangshibiao/article/details/23989499
【原题】
1266: [AHOI2006]上学路线route
Time Limit: 3 Sec Memory Limit: 162 MB
Submit: 1084 Solved: 360
[Submit][Status]
Description
直到有一天他们两人參加了学校的信息学奥林匹克竞赛小组才发现每天上学的乘车路线不一定是最优的。 可可:“非常可能我们在上学的路途上浪费了大量的时间。让我们写一个程序来计算上学须要的最少时间吧!
” 合肥市一共设有N个公交车站,最好还是将它们编号为1…N的自然数,并觉得可可和卡卡家住在1号汽车站附近,而他们学校在N号汽车站。市内有M条直达汽车路线。运行第i条路线的公交车往返于网站pi和qi之间。从起点到终点须要花费的时间为ti。(1<=i<=M,
1<=pi, qi<=N) 两个人坐在电脑前。依据上面的信息非常快就编程算出了最优的乘车方案。然而可可忽然有了一个鬼点子。他想趁卡卡不备。在卡卡的输入数据中删去一些路线,从而让卡卡的程序得出的答案大于实际的最短时间。而对于每一条路线i其实都有一个代价ci:删去路线的ci越大卡卡就越easy发现这个玩笑,可可想知道什么样的删除方案能够达到他的目的而让被删除的公交车路线ci之和最小。 [任务] 编写一个程序: 从输入文件里读取合肥市公交路线的信息。 计算出实际上可可和卡卡上学须要花费的最少时间; 帮助可可设计一个方案,删除输入信息中的一些公交路线,使得删除后从家到学校须要的最少时间变大,而被删除路线的ci和最小。向输出文件输出答案。
Input
Output
第一行中仅有一个整数。表示从可可和卡卡家到学校须要的最短时间。 第二行输出一个整数C,表示Ci之和
Sample Input
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
Sample Output
5
HINT
2<=N<=500, 1<=M<=124 750, 1<=ti, ci<=10 000
合肥市的公交网络十分发达,你能够觉得随意两个车站间都能够通过直达或转车互相到达,当然假设在你提供的删除方案中。家和学校无法互相到达。那么则觉得上学须要的最短为正无穷大:这显然是一个合法的方案。
【分析】真是桑心!!这道题切了一个晚上,最后在RC(Red Cow)的帮助下才解决的。
第一问直接是最短路啊。第二问的意思我看了好久——要选择删掉一些路。使起点到终点的最短路并非原来的最短路(就是略微大一些。哪怕大1也能够),同一时候使删掉的路的ci之和最小。
这样就非常好做了,直接把原来在最短路上的边所有拎出来,做一遍最小割(由于可能有多条最短路)。
【注意点】信心满满地交上去,一直是WA!恰好这一年没有数据,我仅仅能死磕了。自己造了几个数据所有正确!于是无奈地网上下了个标程。写make_data对拍。
拍了5分钟有一个错误:我的q队列开小了。在做SPFA的时候,即使用了flag数组记录是否在队列中。q数组也必需要开大!
。(除非用循环队列)RC说SPFA操作的队列最保险的应该开边的10倍。
后来就一直没拍出错误,但是交上去还是WA!盯着屏幕半天,仍然没什么发现。最后,RC一瞪眼:是不是有重边?我立即把我的邻接矩阵上加了个+,结果A了。恰好我造的数据时去重的,怪不得拍不出错误。
归纳两点:SPFA队列要开大。注意重边。
【代码】
#include<cstdio>
#include<cstring>
#include<algorithm>
#define INF 2100000000
#define N 1005
#define M 250005
using namespace std;
struct arr{int go,c,next,s;}a[M];
int map[N][N],dis[2][N],f[N],q[M*2],end[N];
bool flag[N];
int x,y,z,c,i,n,m,cnt,ans;
void add(int u,int v,int s,int w)
{
a[++cnt].go=v;a[cnt].c=w;a[cnt].s=s;a[cnt].next=end[u];
end[u]=cnt;
}
void SPFA(int o,int sta)
{
int h=0,t=1;q[1]=sta;
memset(flag,0,sizeof(flag));
dis[o][sta]=0;flag[sta]=true;
while (h<t)
{
int now=q[++h];
for (int i=end[now];i;i=a[i].next)
{
int go=a[i].go;
if (dis[o][now]+a[i].s<dis[o][go])
{
dis[o][go]=dis[o][now]+a[i].s;
if (!flag[go]) flag[go]=true,q[++t]=go;
}
}
flag[now]=false;
}
}
void init()
{
for (int i=1;i<=n;i++)
for (int j=end[i];j;j=a[j].next)
if (dis[0][i]+a[j].s+dis[1][a[j].go]==dis[0][n])
map[i][a[j].go]+=a[j].c;
}
bool bfs()
{
memset(f,-1,sizeof(f));
int h=0,t=1;q[1]=1;f[1]=1;
while (h<t)
{
int now=q[++h];if (now==n) return 1;
for (int i=1;i<=n;i++)
if (map[now][i]&&f[i]==-1)
{
f[i]=f[now]+1;
q[++t]=i;
}
}
return 0;
}
int dinic(int sta,int sum)
{
if (sta==n) return sum;int os=sum;
for (int i=1;(i<=n)&&os;i++)
if (map[sta][i]&&f[i]==f[sta]+1)
{
int Min=dinic(i,min(map[sta][i],os));
map[sta][i]-=Min;map[i][sta]+=Min;os-=Min;
}
if (os==sum) f[sta]=-1;return sum-os;
}
int main()
{
scanf("%d%d",&n,&m);
for (i=1;i<=m;i++)
scanf("%d%d%d%d",&x,&y,&z,&c),add(x,y,z,c),add(y,x,z,c);
memset(dis,60,sizeof(dis));SPFA(0,1);SPFA(1,n);
ans=0;init();
while (bfs())
ans+=dinic(1,INF);
printf("%d\n%d",dis[0][n],ans);
return 0;
}
bzoj 1266 [AHOI2006] 上学路线 route 题解的更多相关文章
- BZOJ 1266: [AHOI2006]上学路线route(最短路+最小割)
第一问最短路.第二问,先把最短路的图建出来(边(u,v)满足d[s->u]+d[v->t]+d(u,v)==最短路径长度,就在图中,可以从源点和汇点分别跑一次最短路得到每个点到源点和汇点的 ...
- 洛谷 P4300 BZOJ 1266 [AHOI2006]上学路线route
题目描述 可可和卡卡家住合肥市的东郊,每天上学他们都要转车多次才能到达市区西端的学校.直到有一天他们两人参加了学校的信息学奥林匹克竞赛小组才发现每天上学的乘车路线不一定是最优的. 可可:“很可能我们在 ...
- 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 ...
随机推荐
- Codeforces_791_B. Bear and Friendship Condition_(dfs)
B. Bear and Friendship Condition time limit per test 1 second memory limit per test 256 megabytes in ...
- cookie和session的用法用途,执行流程,区别联系
1.为什么要有cookie/session?在客户端浏览器向服务器发送请求,服务器做出响应之后,二者便会断开连接(一次会话结束).那么下次用户再来请求服务器,服务器没有任何办法去识别此用户是谁.比如w ...
- 笔试算法题(42):线段树(区间树,Interval Tree)
议题:线段树(Interval Tree) 分析: 线段树是一种二叉搜索树,将一个大区间划分成单元区间,每个单元区间对应一个叶子节点:内部节点对应部分区间,如对于一个内部节点[a, b]而言,其左子节 ...
- 在 Sublime Text 直接运行 Javascript 调试控制台
转载自:http://www.jianshu.com/p/43b0726792f7 sublime text javascript Sublime Text是深受喜欢的多语言编辑器,很多开发人员都选择 ...
- STM32F407 GPIO 库函数编程套路(led与beep总结) 个人笔记
本文由正点原子STM32F407探索者开发板的led和beep实验,总结了gpio编程的套路. 下文中以hardware 来称呼可能的硬件外设,如led或beep等. 新建项目后主要用到三个文件:ha ...
- C++——"%"运算符
基本介绍 r=a%b,余数的取值范围为-b+1~b-1,符号与a一致 要想得到0~b-1的余数,可以用:(a%b+b)%b 数位拆解 方法一:反复的:%10,/10 sizea = 0; while ...
- JDBC--JAVA数据库连接相关
JDBC API提供了以下接口和类: DriverManager: 这个类管理数据库驱动程序的列表.确定内容是否符合从Java应用程序使用的通信子协议正确的数据库驱动程序的连接请求.识别JDBC在一定 ...
- 最近编译POCO 库和 Boost库的笔记
最近在编译POCO库和BOOST库 先讲一下编译POCO库,我编译的是1.9.0,过程相当曲折,要OPENSSL修改版本的,个OPENSSL在这里下载,如果你用一般未修改的OPENSSL 是编译不了, ...
- [luoguP2401] 不等数列
传送门 f[i][j]表示前i个数有j个<的方案数 #include <cstdio> #define N 1001 #define p 2015 int n, k; int f[N ...
- HUST 1407(数据结构)
1407 - 郁闷的小J 小J是国家图书馆的一位图书管理员,他的工作是管理一个巨大的书架.虽然他很能吃苦耐劳,但是由于这个书架十分巨大,所以他的工作效率总是很低,以致他面临着被解雇的危险,这也正是他所 ...