BZOJ1266 [AHOI2006]上学路线route Floyd 最小割 SAP
欢迎访问~原文出处——博客园-zhouzhendong
去博客园看该题解
题目传送门 - BZOJ1266
题意概括
一个无向图,第一问:从1~n的最短路。
第二问,删除价值总和最小的边,使得1~n的最短路变长。
题解
第一问floyd跑一跑就可以了。
第二问,最小割就可以了。
最小割相关可以看这里(往后翻就有)。
代码
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cmath>
using namespace std;
const int N=500+5,M=130000;
int n,m,dis[N][N];
struct Read_E{
int x,y,t,c;
}e[M];
struct Edge{
int x,y,cap,flow,nxt;
};
struct Gragh{
static const int Inf=1<<28;
int cnt,fst[N],dist[N],s,t,num[N],cur[N],p[N],q[N],head,tail;
Edge e[M*4];
void set(int S,int T){
s=S,t=T,cnt=1;
memset(fst,0,sizeof fst),memset(e,0,sizeof e);
}
void add(int a,int b,int c){
e[++cnt].x=a,e[cnt].y=b,e[cnt].cap=c,e[cnt].flow=0;
e[cnt].nxt=fst[a],fst[a]=cnt;
e[++cnt].x=b,e[cnt].y=a,e[cnt].cap=0,e[cnt].flow=0;
e[cnt].nxt=fst[b],fst[b]=cnt;
}
void re_bfs(){
memset(dist,-1,sizeof dist);
head=tail=dist[t]=0,q[++tail]=t;
while (head<tail)
for (int x=q[++head],i=fst[x];i;i=e[i].nxt)
if (e[i].cap==0&&dist[e[i].y]==-1)
dist[q[++tail]=e[i].y]=dist[x]+1;
for (int i=1;i<=n;i++)
if (dist[i]==-1)
dist[i]=n+1;
}
int Augment(int &point){
int ex_Flow=Inf;
for (int i=t;i!=s;i=e[p[i]].x)
if (e[p[i]].cap-e[p[i]].flow<=ex_Flow)
ex_Flow=e[p[i]].cap-e[p[i]].flow,point=e[p[i]].x;
for (int i=t;i!=s;i=e[p[i]].x)
e[p[i]].flow+=ex_Flow,e[p[i]^1].flow-=ex_Flow;
return ex_Flow;
}
int SAP(){
int x=s,y,MaxFlow=0;
memset(num,0,sizeof num);
for (int i=1;i<=n;i++)
cur[i]=fst[i],num[dist[i]]++;
while (dist[s]<=n){
if (x==t){
MaxFlow+=Augment(x);
continue;
}
bool found=0;
for (int i=cur[x];i!=0&&!found;i=e[i].nxt)
if (dist[e[i].y]+1==dist[x]&&e[i].cap>e[i].flow)
p[e[i].y]=cur[x]=i,x=e[i].y,found=1;
if (found)
continue;
int d=n+1;
for (int i=fst[x];i;i=e[i].nxt)
if (e[i].cap>e[i].flow)
d=min(d,dist[e[i].y]+1);
if (!(--num[dist[x]]))
return MaxFlow;
num[dist[x]=d]++,cur[x]=fst[x];
if (x!=s)
x=e[p[x]].x;
}
return MaxFlow;
}
}g;
int main(){
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
dis[i][j]=1<<28;
for (int i=1;i<=n;i++)
dis[i][i]=0;
for (int i=1;i<=m;i++){
int x,y,t,c;
scanf("%d%d%d%d",&x,&y,&t,&c);
e[i].x=x,e[i].y=y,e[i].t=t,e[i].c=c;
dis[x][y]=min(dis[x][y],t);
dis[y][x]=min(dis[y][x],t);
}
for (int k=1;k<=n;k++)
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
g.set(1,n);
for (int i=1;i<=m;i++){
int x=e[i].x,y=e[i].y,t=e[i].t,c=e[i].c;
if (dis[1][n]==dis[1][x]+t+dis[y][n])
g.add(x,y,c);
if (dis[1][n]==dis[1][y]+t+dis[x][n])
g.add(y,x,c);
}
g.re_bfs();
printf("%d\n%d",dis[1][n],g.SAP());
return 0;
}
BZOJ1266 [AHOI2006]上学路线route Floyd 最小割 SAP的更多相关文章
- bzoj1266 [AHOI2006]上学路线route floyd+最小割
1266: [AHOI2006]上学路线route Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 2490 Solved: 898[Submit][S ...
- 【BZOJ1266】[AHOI2006]上学路线route Floyd+最小割
[BZOJ1266][AHOI2006]上学路线route Description 可可和卡卡家住合肥市的东郊,每天上学他们都要转车多次才能到达市区西端的学校.直到有一天他们两人参加了学校的信息学奥林 ...
- bzoj1266 [AHOI2006]上学路线route floyd建出最短路图+最小割
1266: [AHOI2006]上学路线route Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 2490 Solved: 898[Submit][S ...
- BZOJ 1266: [AHOI2006]上学路线route Floyd_最小割
十分简单的一道题. 图这么小,跑一边 Floyd 就得到第一问最短路径的答案. 考虑第二问怎么求:我们可以先将最短路径组成的图从原图中抽离出来,构成新图 $G$. 我们发现,只要 $G$ 的起点与终点 ...
- 【最短路】【spfa】【最小割】【Dinic】bzoj1266 [AHOI2006]上学路线route
原问题等价于断掉一些边,让原来所有的最短路全都无法联通S和T. 先求最短路,然后把在最短路上的边(dis[u[i]]+w[i]==dis[v[i]])加入新图里,跑最小割.显然. 注意是无向图. #i ...
- bzoj1266: [AHOI2006]上学路线route
最短路+最小割 首先如何使最短路变长?就是要每一条最短路都割一条边. 我们求出每个点到点1和点n的距离,就可以知道哪些边在最短路上(一开始没有想到求到0和n的距离,想用floyd,但是n=500,怕超 ...
- BZOJ 1266 上学路线route(最小割)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1266 题意:给出一个无向图,每条边有长度和代价.求出1到n的最短路.之后删掉一些边使得1 ...
- 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 ...
随机推荐
- python技巧 一等函数
函数在python中作为一等函数,具有以下特点: 1.可以作为参数传递给其他函数 2.作为其他函数的值返回 3.能赋值给变量或数据结构中的元素 4.在运行的时候创建 In [1]: def add(x ...
- C语言文件操作详解
C语言中没有输入输出语句,所有的输入输出功能都用 ANSI C提供的一组标准库函数来实现.文件操作标准库函数有: 文件的打开操作 fopen 打开一个文件 文件的关闭操作 fclose 关闭一个文件 ...
- Java用System读取系统相关信息、环境变量——(六)
package Java_Test; public class System1 { public static void main(String[] args) { // TODO Auto-gene ...
- jQuery的end() 方法
定义和用法 end() 方法结束当前链条中的最近的筛选操作,并将匹配元素集还原为之前的状态. 语法 .end() 详细说明 大多数 jQuery 的遍历方法会操作一个 jQuery 对象实例,并生成一 ...
- 【转】Python数据类型之“集合(Sets)与映射(Mapping)”
[转]Python数据类型之“集合(Sets)与映射(Mapping)” 一.集合类型(Sets) 集合对象是不同的(不可重复)hashable对象的无序集合.常见用法包括:成员关系测试.移除序列中的 ...
- freeRTOS中文实用教程3--中断管理之延迟中断处理
1.前言 嵌入式实时操作系统需要对整个系统环境产生的事件作出响应.可以采用中断方式也可以采用轮询方式来进行处理.如果采用中断方式,则希望ISR(中断服务例程)的处理时间越短越好. 注:必须说明的是,只 ...
- Linux 调优方案, 修改最大连接数(ulimit命令)【转】
转自:http://blog.csdn.net/liangxiaozhang/article/details/8363435 Linux对于每个用户,系统限制其最大进程数.为提高性能,可以根据设备资源 ...
- 用secureCRT操作ubuntu终端
用secureCRT操作ubuntu终端 ubuntu下先安装ssh windows下win+R再输入ubuntu的ip地址 ubuntu 检测端口号的命令 netstat -antp 下载到 ...
- centos6.5环境disconf管理端安装配置详解
操作系统:centos6.5 x86_64 安装目录/data 1.安装nginx1.10.1 rpm -ivh http://nginx.org/packages/centos/6/noarch/R ...
- win7设置固定IP
正文: 你必须知道你的路由器网关,一般是192.168.1.1(或192.168.0.1) 按传统的来:开始——控制面板——网络和共享中心——更改适配器设置.一般来讲,这里应该有两个图标,一个是有线网 ...