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 分析: 很简单的题目,容易想到就是把所有的最短路径挑出来,然后在这个图里跑最小割 ...
随机推荐
- Git 基础教程 之 创建版本库
一,选择一个合适的地方,创建空目录,下面两种方法都可 ① 手动新建 ② 使用命令: mkdir pythonwork 二,初始化,使目录变成Git可管理的仓库 执行: git i ...
- 1.git的安装和配置
从git官网下一个git安装包. 点击git.exe安装程序,点击[next] 点击[next] 根据自己的需要可以把需要安装软件全选上,点击[next] 由于这是个人使用所以选择第二 ...
- qtp12版本下载安装破解教程
下载链接:https://download.csdn.net/download/weixin_41479750/11240466 下面是安装教程: 解压完成之后,双击运行setup.exe 之后点击运 ...
- 【codeforces 798A】Mike and palindrome
[题目链接]:http://codeforces.com/contest/798/problem/A [题意] 让你严格改变一个字符,使得改变后的字符串为一个回文串; 让你输出可不可能; [题解] 直 ...
- SQL SERVER高级知识积累
什么叫做高可用服务器? 高可用服务器简单来理解就是不宕机的服务器 什么叫走服务器的自动化灾备? 自动灾备的意思就是,让从服务器自动变成主服务器 sql server的聚合是什么? 事务会引起性能下降, ...
- PCA降维技术
PCA降维技术 PCA 降维 Fly Time: 2017-2-28 主成分分析(PCA) PCA Algorithm 实例 主成分分析(PCA) 主成分分析(Principal Component ...
- php类似shell脚本的用法
参考: http://www.cnblogs.com/myjavawork/articles/1869205.html php还可以用于类似于shell脚本,哈哈,对编程语言和对整个计算机系统的认识又 ...
- JavaScript 和Ajax跨域问题
json格式: { "message":"获取成功", "state":"1", "result": ...
- java学习笔记(二)图形用户接口
这个学期主要放在ACM比赛上去了,比赛结束了.不知不觉就15周了,这周就要java考试了,复习一下java吧.java的学习的目的还是让我们学以致用,让我们可以运用java开发一下小项目.而不是单单应 ...
- 0x63树的直径与最近公共祖先
凉 bzoj1999 先把树的直径求出来,从左往右枚举,对于当前位置i,找到满足限制并且最远的点j,当前位置最大值就是max(i~j区间内除直径外的子树路径长度最大值,1~i的长度,j~n的长度) 然 ...