题意:给定一个n个点m条边的有向图,每条边有个长度,可以花费等同于其长度的代价将其破坏掉,求最小的花费使得从1到n的最短路变长。

解法:先用dijkstra求出以1为源点的最短路,并建立最短路图(只保留d[v]=d[u]+e[i].c的边(u,v)),跑个最大流即可。

Dinic:

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1e4+,inf=0x3f3f3f3f3f3f3f3fll;
ll n,m;
struct MF {
ll hd[N],ne,d[N],g[N],cur[N];
struct E {ll v,cp,nxt;} e[N<<];
void init() {memset(hd,-,sizeof hd),ne=;}
void addedge(ll u,ll v,ll cp) {
e[ne]= {v,cp,hd[u]},hd[u]=ne++;
e[ne]= {u,,hd[v]},hd[v]=ne++;
}
int bfs(ll s,ll t) {
queue<ll> q;
memset(d,-,sizeof d);
d[s]=,q.push(s);
while(q.size()) {
ll u=q.front();
q.pop();
for(ll i=hd[u]; ~i; i=e[i].nxt)if(e[i].cp) {
ll v=e[i].v;
if(!~d[v])d[v]=d[u]+,q.push(v);
}
}
return ~d[t];
}
ll dfs(ll t,ll u,ll f) {
if(u==t||!f)return f;
ll ret=;
for(ll& i=cur[u]; ~i; i=e[i].nxt) {
ll v=e[i].v;
if(d[v]==d[u]+) {
ll df=dfs(t,v,min(f,e[i].cp));
e[i].cp-=df,e[i^].cp+=df,f-=df,ret+=df;
if(!f)return ret;
}
}
return ret;
}
ll dinic(ll s,ll t) {
ll ret=;
while(bfs(s,t)) {
for(ll i=; i<=n; ++i)cur[i]=hd[i];
ret+=dfs(t,s,inf);
}
return ret;
}
} mf;
struct SP {
ll hd[N],ne,dp[N];
struct E {ll v,c,nxt;} e[N];
void init() {memset(hd,-,sizeof hd),ne=;}
void addedge(ll u,ll v,ll c) {e[ne]= {v,c,hd[u]},hd[u]=ne++;}
struct D {
ll u,g;
bool operator<(const D& b)const {return b.g>g;}
};
priority_queue<D> q;
void upd(ll u,ll ad) {if(dp[u]>ad)dp[u]=ad,q.push({u,ad});}
void dij(ll s) {
memset(dp,inf,sizeof dp);
upd(s,);
while(q.size()) {
ll u=q.top().u,g=q.top().g;
q.pop();
if(dp[u]!=g)continue;
for(ll i=hd[u]; ~i; i=e[i].nxt) {
ll v=e[i].v,c=e[i].c;
upd(v,g+c);
}
}
}
void solve() {
dij();
for(ll u=; u<=n; ++u) {
for(ll i=hd[u]; ~i; i=e[i].nxt) {
ll v=e[i].v,c=e[i].c;
if(dp[v]==dp[u]+c)mf.addedge(u,v,c);
}
}
printf("%lld\n",mf.dinic(,n));
}
} sp;
int main() {
ll T;
for(scanf("%lld",&T); T--;) {
sp.init(),mf.init();
scanf("%lld%lld",&n,&m);
while(m--) {
ll u,v,c;
scanf("%lld%lld%lld",&u,&v,&c);
sp.addedge(u,v,c);
}
sp.solve();
}
return ;
}

ISAP:

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1e4+,inf=0x3f3f3f3f3f3f3f3fll;
ll n,m;
struct MF {
ll hd[N],ne,d[N],g[N],cur[N];
struct E {ll v,cp,nxt;} e[N<<];
void init() {memset(hd,-,sizeof hd),ne=;}
void addedge(ll u,ll v,ll cp) {
e[ne]= {v,cp,hd[u]},hd[u]=ne++;
e[ne]= {u,,hd[v]},hd[v]=ne++;
}
void bfs(ll s) {
queue<ll> q;
memset(d,-,sizeof d);
memset(g,,sizeof g);
++g[d[s]=],q.push(s);
while(q.size()) {
ll u=q.front();
q.pop();
for(ll i=hd[u]; ~i; i=e[i].nxt) {
ll v=e[i].v;
if(!~d[v])++g[d[v]=d[u]+],q.push(v);
}
}
}
ll dfs(ll s,ll t,ll u,ll f) {
if(u==t||!f)return f;
ll ret=;
for(ll& i=cur[u]; ~i; i=e[i].nxt) {
ll v=e[i].v;
if(d[v]==d[u]-) {
ll df=dfs(s,t,v,min(f,e[i].cp));
e[i].cp-=df,e[i^].cp+=df,f-=df,ret+=df;
if(!f)return ret;
}
}
if(!--g[d[u]])d[s]=n+;
++g[++d[u]],cur[u]=hd[u];
return ret;
}
ll isap(ll s,ll t) {
ll ret=;
bfs(t);
for(ll i=; i<=n; ++i)cur[i]=hd[i];
while(d[s]<n+)ret+=dfs(s,t,s,inf);
return ret;
}
} mf;
struct SP {
ll hd[N],ne,dp[N];
struct E {ll v,c,nxt;} e[N];
void init() {memset(hd,-,sizeof hd),ne=;}
void addedge(ll u,ll v,ll c) {e[ne]= {v,c,hd[u]},hd[u]=ne++;}
struct D {
ll u,g;
bool operator<(const D& b)const {return b.g>g;}
};
priority_queue<D> q;
void upd(ll u,ll ad) {if(dp[u]>ad)dp[u]=ad,q.push({u,ad});}
void dij(ll s) {
memset(dp,inf,sizeof dp);
upd(s,);
while(q.size()) {
ll u=q.top().u,g=q.top().g;
q.pop();
if(dp[u]!=g)continue;
for(ll i=hd[u]; ~i; i=e[i].nxt) {
ll v=e[i].v,c=e[i].c;
upd(v,g+c);
}
}
}
void solve() {
dij();
for(ll u=; u<=n; ++u) {
for(ll i=hd[u]; ~i; i=e[i].nxt) {
ll v=e[i].v,c=e[i].c;
if(dp[v]==dp[u]+c)mf.addedge(u,v,c);
}
}
printf("%lld\n",mf.isap(,n));
}
} sp;
int main() {
ll T;
for(scanf("%lld",&T); T--;) {
sp.init(),mf.init();
scanf("%lld%lld",&n,&m);
while(m--) {
ll u,v,c;
scanf("%lld%lld%lld",&u,&v,&c);
sp.addedge(u,v,c);
}
sp.solve();
}
return ;
}

这道题Dinic居然比ISAP快,我的代码ISAP跑了156ms,而Dinic只跑了93ms..

HDU - 6582 Path (最短路+最小割)的更多相关文章

  1. [2019杭电多校第一场][hdu6582]Path(最短路&&最小割)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6582 题意:删掉边使得1到n的最短路改变,删掉边的代价为该边的边权.求最小代价. 比赛时一片浆糊,赛后 ...

  2. 2019HDU多校Path——最短路最小割

    题目 给出一个 $n$ 个顶点 $m$ 条边的图,要求阻塞一些边,使得从 $1$ 到 $n$ 的最短路变长,求阻塞的边长度和的最小值,不必保证阻塞后可达. 分析 很显然,要阻塞的边肯定在最短路图上,先 ...

  3. hdu 6852Path6(最短路+最小割)

    传送门 •题意 有n个城市,标号1-n 现花费最小的代价堵路 使得从1号城市到n号城市的路径边长 (注意只是变长不是最长) 堵一条路的代价是这条路的权值 •思路 在堵路以前,从1到n的最小路径当然是最 ...

  4. 2019 Multi-University Training Contest 1 Path(最短路+最小割)

    题意:给你n个点 m条边 现在你能够堵住一些路 问怎样能让花费最少且让1~n走的路比最短路的长度要长 思路:先跑一边最短路 建一个最短路图 然后我们跑一边最大流求一下最小割即可 #include &l ...

  5. Barricade HDU - 5889(最短路+最小割)

    Barricade Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total S ...

  6. 【bzoj1266】[AHOI2006]上学路线route 最短路+最小割

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

  7. HDU 5889 Barricade(最短路+最小割水题)

    Barricade Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total ...

  8. HDU 5889 Barricade(最短路+最小割)

    http://acm.hdu.edu.cn/showproblem.php?pid=5889 题意: 给出一个图,帝国将军位于1处,敌军位于n处,敌军会选择最短路到达1点.现在帝国将军要在路径上放置障 ...

  9. 2019 Multi-University Training Contest 1 E Path(最短路+最小割)

    题意 链接:https://vjudge.net/problem/HDU-6582 给定一个有向图,可以有重边,每条边上有一个权值表示删掉这条边的代价,问最少花费多少代价能使从s到t节点的最短路径增大 ...

随机推荐

  1. VS快捷键操作

    1.窗口快捷键记忆诀窍: 凡跟窗口挂上钩的快捷键必有一个W(Windows):Ctrl+W,W: 浏览器窗口 (浏览橱窗用有道的翻译是window shopping) Ctrl+W,S: 解决方案管理 ...

  2. linux查询日志命令总结

    [背景] 排查线上环境问题,少不了去线上查日志.而使用什么命令,能快速准确地查到我们需要查找地日志信息,也是我们需要掌握的一项技能. [命令] Linux查看命令有多种:tail,head,cat,t ...

  3. python高级 之(二) --- 类装饰器

    装饰器-初级 在不改变原有函数逻辑功能的基础上,为函数添加新的逻辑功能.使代码可读性更高.结构更加清晰.冗余度更低 简介 """ 闭包: 函数嵌套的格式就是闭包.写装饰器 ...

  4. Leetcode之动态规划(DP)专题-62. 不同路径(Unique Paths)

    Leetcode之动态规划(DP)专题-62. 不同路径(Unique Paths) 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” ). 机器人每次只能向下或者向 ...

  5. Ubuntu下c程序运行原理

    运行环境: 1.Vitural box下安装Ubuntu虚拟机 2.编译运行工具:gcc 3.编辑器:vim 主要过程: 1.利用vim编辑hello.c 2.编译和执行 (1)预处理阶段:使用 -E ...

  6. 【Linux开发】linux设备驱动归纳总结(三):3.设备驱动面向对象思想和lseek的实现

    linux设备驱动归纳总结(三):3.设备驱动面向对象思想和lseek的实现 一.结构体struct file和struct inode 在之前写的函数,全部是定义了一些零散的全局变量.有没有办法整合 ...

  7. logstash 处理信息规律研究

    1.input file path => "/opt/50910627.log" path => "/path/to/%{+yyyy/MM/dd/hh}.lo ...

  8. Vue 项目结构介绍

    Vue 项目创建完成后,使用 Web Storm 打开项目,项目目录如下: build 文件夹,用来存放项目构建脚本 config 中存放项目的一些基本配置信息,最常用的就是端口转发 node_mod ...

  9. Laravel验证问题记录

    1.当购物车提交时,POST传来一个对象{address:2,item:{ {ksu_id:2,count:2},{ksu_id:2,count:2}, } 验证方法: public function ...

  10. mysql的授权命令

    #查看用户select user,host from mysql.user; (root,%),表示可以远程登录,并且是除服务器外的其他任何终端, 如CREATE USER 'azkaban'@'19 ...