【最短路+最大流】上学路线@安徽OI2006

PROBLEM

洛谷P4300

SOLUTION

先在原图上跑单源最短路,找出包含所有最短路径的子图。

要使从S到T的最短路变长,那么在子图中S到T不再连通,要求代价最小,即在子图上找最小割。

因为“最小割等于最大流“,所以在子图上跑一遍最大流。

自己犯蠢,最短路子图建的双向边,wa了好几发

CODE

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 505;
const int MAXE = 124755*2;
const ll INF = 1247550005;
int n,m; struct data {
int u,v,t,c;
} da[MAXE*2]; struct Graph1 {
struct edge {
int v,t,nex;
} ed[MAXE];
int head[MAXN],tot;
void addedge(int u,int v,int t) {
tot++;
ed[tot].v = v;
ed[tot].t = t;
ed[tot].nex = head[u];
head[u] = tot;
}
ll d[MAXN];int p[MAXN];
bool vis[MAXN];
priority_queue<pair<ll,int> >q;
void dijkstra(int st) {
fill(d,d+n+1,INF);
memset(vis,0,sizeof vis);
d[st] = 0;
q.push({0,st});
while(q.size()) {
int x = q.top().second;
q.pop();
if(vis[x])
continue;
vis[x] = 1;
for(int i = head[x]; i; i=ed[i].nex) {
int y = ed[i].v,z = ed[i].t;
if(d[y]>d[x]+z) {
d[y] = d[x] + z;
q.push({-d[y],y});
p[y] = i;
}
}
}
}
bool flag[MAXE];
queue<int> q2;
void bfs() {
memset(flag,0,sizeof flag);
memset(vis,0,sizeof vis);
q2.push(n);
while(q2.size()) {
int x = q2.front();
q2.pop();
if(vis[x])
continue;
vis[x] = 1;
int pre = p[x];
for(int i = head[x]; i; i=ed[i].nex) {
int y = ed[i].v,z = ed[i].t;
if((i^1) == pre||d[y] + z == d[ed[pre^1].v] + ed[pre^1].t) {
flag[i^1] = 1;
q2.push(y);
}
}
}
}
} G1; struct Graph2 {
int head[MAXN],ver[MAXE<<1],Next[MAXE<<1],d[MAXN];
int s,t,tot;
ll maxflow,edge[MAXE<<1];
queue<int> q;
void add(int x,int y,int z) {
ver[++tot] = y,edge[tot] = z,Next[tot] = head[x],head[x] = tot;
ver[++tot] = x,edge[tot] = 0,Next[tot] = head[y],head[y] = tot;
}
bool bfs() {
memset(d,0,sizeof d);
while(q.size())
q.pop();
q.push(s);
d[s] = 1;
while(q.size()) {
int x = q.front();
q.pop();
for(int i = head[x]; i; i=Next[i])
if(edge[i]&&!d[ver[i]]) {
q.push(ver[i]);
d[ver[i]] = d[x] + 1;
if(ver[i]==t)
return 1;
}
}
return 0;
}
ll dinic(int x,ll flow) {
if(x==t)
return flow;
ll rest = flow,k;
for(int i = head[x]; i && rest; i=Next[i])
if(edge[i]&&d[ver[i]] == d[x] + 1) {
k = dinic(ver[i],min(rest,(ll)edge[i]));
if(!k)
d[ver[i]] = 0;
edge[i] -= k;
edge[i^1] += k;
rest-=k;
}
return flow - rest;
}
} G2; int main() {
scanf("%d%d",&n,&m);
G1.tot = 1;
for(int i=1; i<=m; i++) {
int u,v,t,c;
scanf("%d%d%d%d",&u,&v,&t,&c);
da[i*2] = {u,v,t,c};
da[i*2+1] = {v,u,t,c};
G1.addedge(u,v,t);
G1.addedge(v,u,t);
}
G1.dijkstra(1);
G1.bfs();
G2.s = 1;
G2.t = n;
G2.tot = 1;
for(int i=2; i<=G1.tot; i++) {
if(G1.flag[i]) {
int x = da[i].u,y = da[i].v,c = da[i].c;
G2.add(x,y,c);
}
}
ll flow = 0;
while(G2.bfs())
while(flow=G2.dinic(G2.s,INF))
G2.maxflow += flow;
cout<<G1.d[n]<<endl;
cout<<G2.maxflow<<endl;
return 0;
}

【最短路+最大流】上学路线@安徽OI2006的更多相关文章

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

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

  2. bzoj1266 [AHOI2006]上学路线route floyd建出最短路图+最小割

    1266: [AHOI2006]上学路线route Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 2490  Solved: 898[Submit][S ...

  3. BZOJ_1266_[AHOI2006]上学路线route_最小割

    BZOJ_1266_[AHOI2006]上学路线route_最小割 Description 可可和卡卡家住合肥市的东郊,每天上学他们都要转车多次才能到达市区西端的学校.直到有一天他们两人参加了学校的信 ...

  4. bzoj 1266 [AHOI2006] 上学路线 route 题解

    转载请注明:http://blog.csdn.net/jiangshibiao/article/details/23989499 [原题] 1266: [AHOI2006]上学路线route Time ...

  5. bzoj 1266 1266: [AHOI2006]上学路线route

    1266: [AHOI2006]上学路线route Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 2356  Solved: 841[Submit][S ...

  6. codevs2693 上学路线(施工)

    难度等级:黄金 2693 上学路线(施工) 题目描述 Description 问题描述 你所在的城市街道好像一个棋盘,有a条南北方向的街道和b条东西方向的街道. 南北方向a条街道从西到东依次编号为1到 ...

  7. hdu5294||2015多校联合第一场1007 最短路+最大流

    http://acm.hdu.edu.cn/showproblem.php? pid=5294 Problem Description Innocent Wu follows Dumb Zhang i ...

  8. BZOJ 3931: [CQOI2015]网络吞吐量( 最短路 + 最大流 )

    最短路 + 最大流 , 没什么好说的... 因为long long WA 了两次.... ------------------------------------------------------- ...

  9. BZOJ 3782: 上学路线 [Lucas定理 DP]

    3782: 上学路线 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 192  Solved: 75[Submit][Status][Discuss] ...

随机推荐

  1. python django(forms组件)

    forms组件最大的作用,就是做数据校验. 普通做法,一个一个写校验规则,没有解耦.校验规则,都在视图函数里面. 网页校验 修改urls.py,增加路径addbook from app01 impor ...

  2. [物理学与PDEs]第3章习题1 只有一个非零分量的磁场

    设磁场 ${\bf H}$ 只有一个非零分量, 试证明 $$\bex ({\bf H}\cdot\n){\bf H}={\bf 0}. \eex$$ 证明: 不妨设 ${\bf H}=(0,0,H_3 ...

  3. Django的Admin站点管理

    一.概述 内容发布:负责添加.修改.删除内容 公告访问 二.配置Admin应用 在settings.py文件中的INSTALLED_APPS中添加'django.contrib.admin',默认是添 ...

  4. 其他-pkuwc2019数学考试题目

    时限150min,有windows和Ubuntu使用 十道填空题,在poj上举行,选手提交答案,系统将答案自动填入一个作用是输出答案的程序,再将该程序提交评测(由于该程序变量名为longlong,所以 ...

  5. spring集成Junit做单元测试及常见异常解决办法

    spring-test依赖包 <!--Spring-test --> <!-- https://mvnrepository.com/artifact/org.springframew ...

  6. Lua 中 pairs 和 ipairs 的区别

    ipairs (t) Returns three values: an iterator function, the table t, and 0, so that the construction ...

  7. OpenCV3编程入门读书笔记4-形态学滤波

    一.腐蚀和膨胀 1.腐蚀和膨胀的主要功能 (1)消除噪声 (2)分割出独立的图像元素,在图像中连接相邻的元素 (3)寻找图像中的极大值或者极小值区域 (4)求出图像的梯度 2.膨胀(dilate) 膨 ...

  8. 【原创】大数据基础之Zookeeper(1)介绍、安装及使用

    zookeeper3.4.11 http://zookeeper.apache.org/ 一 简介 ZooKeeper is a centralized service for maintaining ...

  9. noj 算法 八数码问题

    描述 在九宫格里放在1到8共8个数字还有一个是空格,与空格相邻的数字可以移动到空格的位置,问给定的状态最少需要几步能到达目标状态(用0表示空格):1 2 34 5 67 8 0   输入 输入一个给定 ...

  10. Java的家庭记账本程序(K)

    日期:2019.3.10 博客期:043 星期日 呕吼~这里是编程菜鸟小Master,今天加油的把第二个模板套用了,更改了许多的设定,我想这一个程序的网页版也就到这里结束了,下面是一部分的展示图,想要 ...