转载请注明: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

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

Output

输出文件最多有两行。

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

Sample Input

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

Sample Output

2

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 题解的更多相关文章

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

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

  2. 洛谷 P4300 BZOJ 1266 [AHOI2006]上学路线route

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

  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. CSS中的趣事之float浮动

       浮动float一般跟left或是right: 特性: 1,包裹性:浮动文本类型时,需要指定宽度width,如果不指定,就会折叠到最小宽度: 2,浮动会影响别的元素: 3,子级浮动,会导致父级高度 ...

  2. ar - 建立, 修改档案或从档案中抽取成员.

    总览 ar [-]{dmpqrtx}[abcfilNoPsSuvV] [membername] [count] archive files... 描述 GNU 组织的ar 程序 用于建立, 修改档案 ...

  3. Vue完成TodoList案例

    写一个简单的TodoList的更实用(文末有彩蛋). 一,使用VUE-CLI脚手架快速搭建一个框架 利用VUE-CLI来自动生成我们项目的前端目录及文件,方法: npm install -g vue- ...

  4. BZOJ 4695 最假女选手 线段树

    题意: 给定一个长度为 N序列,编号从1 到 N.要求支持下面几种操作: 1.给一个区间[L,R] 加上一个数x  2.把一个区间[L,R] 里小于x 的数变成x  3.把一个区间[L,R] 里大于x ...

  5. Python 迭代器-生成器-面向过程编程

    上节课复习:1. 函数的递归调用 在调用一个函数的过程中又直接或者间接地调用了函数本身称之为函数的递归 函数的递归调用有两个明确的阶段: 1. 回溯 一层一层地调用本身 注意: 1.每一次调用问题的规 ...

  6. [Python3网络爬虫开发实战] 1.4.1-MySQL的安装

    MySQL是一个轻量级的关系型数据库,本节中我们来了解下它的安装方式. 1. 相关链接 官方网站:https://www.mysql.com/cn 下载地址:https://www.mysql.com ...

  7. Linux系统用户、组和权限管理

    一.用户与组 1.用户与组的概念 在linux系统中,根据系统管理需要将用户分为三种类型: 1.超级用户:root是linux系统的超级用户,对系统拥有绝对权限.由于root用户权限太大,只有在进行系 ...

  8. solr-5.3.1配置(win7 x64)

    下载solr,下载地址http://www.eu.apache.org/dist/lucene/solr/5.3.1/solr-5.3.1.zip 解压到某个目录下,这里是解压到了d盘目录下,路径:D ...

  9. Mac使用Aria2下载百度网盘,突破下载限速的方法教程

    百度网盘目前可以说是在国内网盘环境中一枝独秀,日常使用触及在所难免,尤其是对于喜欢下载资源的朋友来说,但是一些限制让它的使用越来越难,尤其是下载速度,普通用户的下载往往远低于自己的预期,特别是对于 M ...

  10. FFmpeg加水印

    ffmpeg中文水印乱码两种原因 1.字符编码格式原因,中文必须是utf8编码格式的(我遇到的问题,在vs2013上写的中文,已做编码格式转码,放到centos7.2上编译运行也会出现中文乱码的问题, ...