十分简单的一道题.
图这么小,跑一边 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_最小割的更多相关文章

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

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

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

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

  3. bzoj1266 [AHOI2006]上学路线route floyd+最小割

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

  4. 【BZOJ1266】[AHOI2006]上学路线route Floyd+最小割

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

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

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

  6. BZOJ 1266: [AHOI2006]上学路线route

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

  7. BZOJ1266 [AHOI2006]上学路线route Floyd 最小割 SAP

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1266 题意概括 一个无向图,第一问:从1~n的最短路. 第二问,删除价值总和最小的边,使得1~n的 ...

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

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

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

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1266 分析: 很简单的题目,容易想到就是把所有的最短路径挑出来,然后在这个图里跑最小割 ...

随机推荐

  1. 【ABCD组】Scrum meeting 5

    前言 第5次会议在6月17日由组长在教9 405召开. 主要对下一步的工作进行说明安排,时长90min. 主要内容 分配下阶段任务,争取在这阶段完成软件的设计阶段 任务分配 姓名 当前阶段任务 贡献时 ...

  2. ro的session

    1.需要session管理器,根据需要选择: 2.需要一个login和logout的服务.注意:设定TRORemobteDataMedule.sessionmanager,但要设定TRORemobte ...

  3. 用JMeter作WebService接口功能测试(可以借助SoapUI来完成)

    SoapUI里面的操作: Wsdl文件或链接导入或添加到SoapUI打开待测请求:运行请求:取URL  SOAPAction .报文. JMeter里面的操作: 为线程组添加SOAP/XML-RPC ...

  4. vs code--使用教程

    这是Cnode论坛上的i5ting写的,很详细 教程地址 这个是微软官方的英文版的教程,这个更详细一些 微软官方vs code教程

  5. [bzoj1001][BeiJing2006]狼抓兔子_网络流_最小割转对偶图

    狼抓兔子 bzoj-1001 BeiJing2006 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还 ...

  6. Js计算指定日期

    function DateAdd(interval,number,date) { /* * 功能:实现VBScript的DateAdd功能. * 参数:interval,字符串表达式,表示要添加的时间 ...

  7. HDU 3432

    水题,就是把一个矩形平分. 题意:一个wid*hei的矩形,过底边上的一点(dor,0)做m-1条射线,把这个矩形的面积平均分成m份,求这些射线和矩形的另外一个交点. 直接枚举,然而求三角形高底移动坐 ...

  8. 面向基于英特尔&#174; 架构的 Android* 的 CoCos2D

    Cocos2D 是一款游戏引擎,可与从电脑到手机等多种设备配合使用. 该引擎支持丰富的特性,可帮助创建出色的 2D 游戏.它甚至包含具备全面功能的物理引擎. CoCos2D 的核心元素是基本动画元素( ...

  9. u-boot学习(五):u-boot启动内核

    u-boot的目的是启动内核.内核位于Flash中,那么u-boot就要将内核转移到内存中.然后执行命令执行之.这些操作是由bootcmd命令完毕的. bootcmd=nand read.jffs2 ...

  10. BNU 34990 Justice String 2014 ACM-ICPC Beijing Invitational Programming Contest

    题目链接:http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=34990 DEBUG了非常久,还是legal的推断函数写错了... 此题做法.枚举Stri ...