BZOJ 1266: [AHOI2006]上学路线route Floyd_最小割
十分简单的一道题.
图这么小,跑一边 Floyd 就得到第一问最短路径的答案.
考虑第二问怎么求:
我们可以先将最短路径组成的图从原图中抽离出来,构成新图 $G$.
我们发现,只要 $G$ 的起点与终点联通,那么最短路径就仍然存在.
所以我们想用最小的代价破坏掉 $G$ 点起点与终点的连通性.
这不就是最小割的定义嘛...... 跑一边最大流即可.
Code:
#include <bits/stdc++.h>
#define setIO(s) freopen(s".in","r",stdin)
#define maxn 200000
#define N 502
#define ll int
#define inf 1000000
using namespace std;
int n,m;
struct Graph
{
int u,v,dis,c;
Graph(int u = 0,int v = 0,int dis = 0,int c = 0) : u(u), v(v), dis(dis), c(c){}
}G[maxn];
namespace Dinic{
struct Edge
{
int from,to,cap;
Edge(int a = 0,int b = 0,int c = 0):from(a),to(b),cap(c){}
};
vector <Edge> edges;
vector <int> G[N];
queue <int> Q;
int current[N], d[N], vis[N],s,t;
void add(int u,int v,int c)
{
edges.push_back(Edge(u,v,c));
edges.push_back(Edge(v,u,0));
int kk = edges.size();
G[u].push_back(kk - 2);
G[v].push_back(kk - 1);
}
int BFS()
{
memset(vis,0,sizeof(vis));
vis[s] = 1, d[s] = 0;
Q.push(s);
while(!Q.empty())
{
int u = Q.front(); Q.pop();
for(int sz = G[u].size(),i = 0;i < sz; ++i)
{
Edge e = edges[G[u][i]];
if(e.cap > 0 && !vis[e.to])
{
vis[e.to] = 1, d[e.to] = d[u] + 1;
Q.push(e.to);
}
}
}
return vis[t];
}
int dfs(int x,int cur)
{
if(x == t) return cur;
int f=0,flow = 0;
for(int sz = G[x].size(),i = current[x];i < sz; ++i)
{
current[x] = i;
Edge e = edges[G[x][i]];
if(e.cap > 0 && d[e.to] == d[x] + 1)
{
f = dfs(e.to, min(cur,e.cap));
cur -= f, flow += f;
edges[G[x][i]].cap -= f, edges[G[x][i] ^ 1].cap += f;
}
if(cur == 0) break;
}
return flow;
}
int maxflow()
{
int ans = 0;
while(BFS())
{
memset(current,0,sizeof(current));
ans += dfs(s,inf);
}
return ans;
}
};
namespace Floyd{
ll dis[N][N];
void init()
{
for(int i = 0;i < N; ++i)
for(int j = 0;j < N; ++j) dis[i][j] = inf;
for(int i = 0;i < N; ++i) dis[i][i] = 0;
}
void calc()
{
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][k] + dis[k][j], dis[i][j]);
for(int i = 1;i <= m; ++i)
{
Graph e = G[i];
if(dis[1][e.u] + dis[e.v][n] + e.dis == dis[1][n]) Dinic :: add(e.u,e.v,e.c);
if(dis[1][e.v] + dis[e.u][n] + e.dis == dis[1][n]) Dinic :: add(e.v,e.u,e.c);
}
}
};
int main()
{
// setIO("input");
Floyd :: init();
scanf("%d%d",&n,&m);
for(int i = 1,a,b,c,d;i <= m; ++i)
{
scanf("%d%d%d%d",&a,&b,&c,&d);
Floyd :: dis[a][b] = Floyd :: dis[b][a] = c;
G[i] = Graph(a,b,c,d);
}
Floyd :: calc();
printf("%d\n",Floyd :: dis[1][n]);
Dinic :: s = 1, Dinic :: t = n;
printf("%d",Dinic :: maxflow());
return 0;
}
BZOJ 1266: [AHOI2006]上学路线route Floyd_最小割的更多相关文章
- 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 ...
- 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 可可和卡卡家住合肥市的东郊,每天上学他们都要转车多次才能到达市区西端的学校.直到有一天他们两人参加了学校的信息学奥林 ...
- 洛谷 P4300 BZOJ 1266 [AHOI2006]上学路线route
题目描述 可可和卡卡家住合肥市的东郊,每天上学他们都要转车多次才能到达市区西端的学校.直到有一天他们两人参加了学校的信息学奥林匹克竞赛小组才发现每天上学的乘车路线不一定是最优的. 可可:“很可能我们在 ...
- BZOJ 1266: [AHOI2006]上学路线route
题目描述 可可和卡卡家住合肥市的东郊,每天上学他们都要转车多次才能到达市区西端的学校.直到有一天他们两人参加了学校的信息学奥林匹克竞赛小组才发现每天上学的乘车路线不一定是最优的. 可可:"很 ...
- BZOJ1266 [AHOI2006]上学路线route Floyd 最小割 SAP
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1266 题意概括 一个无向图,第一问:从1~n的最短路. 第二问,删除价值总和最小的边,使得1~n的 ...
- 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 分析: 很简单的题目,容易想到就是把所有的最短路径挑出来,然后在这个图里跑最小割 ...
随机推荐
- DateTime日期格式转换,不受系统格式的影响
Application.Initialize; with FormatSettings do begin ShortDateFormat := 'yyyy-mm-dd'; LongDa ...
- jquery-cookie持久化
jQuery.Cookie.js,是一个轻量级的Cookie管理插件 <script src="jQuery.1.8.3.js" type="text/javasc ...
- ubuntu-kill命令-杀死进程
显示进程pid ps -A 杀进程的命令 kill -s 9 xxx(进程pid)
- java反射意义
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制. ...
- Unable to read the project file 'client.csproj'. Could not load file or assembly 'Microsoft.Build.En
错误具体信息: Unable to read the project file 'client.csproj'. Could not load file or assembly 'Microsoft. ...
- Mac下搭建hexo3.0博客
Mac下搭建hexo3.0博客(文章同步自个人博客站点以及Github博客https://xingstarx.github.io/) window环境下搭建hexo博客 详细内容能够參考这一篇文章怎样 ...
- 轻快的VIM(五):复制
操作相同文本的时候复制尤其有效,在Windows中我们都习惯了先用鼠标选择文本 而Vim下则不用那么麻烦,你甚至可以使用可视模式操作,但这里先略过 我在这一节主要说说命令模式下的复制 在讲复制之前我要 ...
- [Oracle] Oracle终极解锁
一些ORACLE中的进程被杀掉后,状态被置为"killed",但是锁定的资源很长时间不释放,有时实在没办法,只好重启数据库.现在提供一种方法解决这种问题,那就是在ORACLE中杀不 ...
- MySQL视图、触发器、事务、存储过程、函数
视图.触发器.事务.存储过程.函数 阅读目录 一 视图 二 触发器 三 事务 四 存储过程 五 函数 六 流程控制 一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据 ...
- AHOI 2009 (BZOJ1798)维护序列 seq (线段树好题?)
我是不会说这个题很坑的.. 改了一晚上... // by SiriusRen #include <cstdio> #define N 150000 #define LSON l,mid,l ...