HDU - 6582 Path (最短路+最小割)
题意:给定一个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 (最短路+最小割)的更多相关文章
- [2019杭电多校第一场][hdu6582]Path(最短路&&最小割)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6582 题意:删掉边使得1到n的最短路改变,删掉边的代价为该边的边权.求最小代价. 比赛时一片浆糊,赛后 ...
- 2019HDU多校Path——最短路最小割
题目 给出一个 $n$ 个顶点 $m$ 条边的图,要求阻塞一些边,使得从 $1$ 到 $n$ 的最短路变长,求阻塞的边长度和的最小值,不必保证阻塞后可达. 分析 很显然,要阻塞的边肯定在最短路图上,先 ...
- hdu 6852Path6(最短路+最小割)
传送门 •题意 有n个城市,标号1-n 现花费最小的代价堵路 使得从1号城市到n号城市的路径边长 (注意只是变长不是最长) 堵一条路的代价是这条路的权值 •思路 在堵路以前,从1到n的最小路径当然是最 ...
- 2019 Multi-University Training Contest 1 Path(最短路+最小割)
题意:给你n个点 m条边 现在你能够堵住一些路 问怎样能让花费最少且让1~n走的路比最短路的长度要长 思路:先跑一边最短路 建一个最短路图 然后我们跑一边最大流求一下最小割即可 #include &l ...
- Barricade HDU - 5889(最短路+最小割)
Barricade Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total S ...
- 【bzoj1266】[AHOI2006]上学路线route 最短路+最小割
题目描述 可可和卡卡家住合肥市的东郊,每天上学他们都要转车多次才能到达市区西端的学校.直到有一天他们两人参加了学校的信息学奥林匹克竞赛小组才发现每天上学的乘车路线不一定是最优的. 可可:“很可能我们在 ...
- HDU 5889 Barricade(最短路+最小割水题)
Barricade Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total ...
- HDU 5889 Barricade(最短路+最小割)
http://acm.hdu.edu.cn/showproblem.php?pid=5889 题意: 给出一个图,帝国将军位于1处,敌军位于n处,敌军会选择最短路到达1点.现在帝国将军要在路径上放置障 ...
- 2019 Multi-University Training Contest 1 E Path(最短路+最小割)
题意 链接:https://vjudge.net/problem/HDU-6582 给定一个有向图,可以有重边,每条边上有一个权值表示删掉这条边的代价,问最少花费多少代价能使从s到t节点的最短路径增大 ...
随机推荐
- php进阶之路 -- 03 命名空间
php进阶之路 -- 03 命名空间 命名空间概述 定义命名空间 空间成员和子空间 空间成员的访问 空间引入 全局空间 一. 命名空间概述 什么是命名空间?从广义上来说,命名空间是一种封装事物的方法. ...
- XML JS Demo
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- flask_migrate 的应用
怎么查看的命令: python manage.py --help 使用flask_migrate的注意事项:
- 搭建本地parcel仓库
参考:https://www.cloudera.com/documentation/enterprise/6/6.2/topics/cm_ig_create_local_parcel_repo.htm ...
- 【Linux-驱动】简单字符设备驱动结构和初始化
(1)在编写简单字符设备驱动的时候,首先要申请一个设备结构struct cdev: struct cdev { struct kobject kobj; struct module *owner; / ...
- HighGo瀚高数据库4.3版本安装说明
1. 通过与瀚高同事沟通, 获取到安装文件(点赞一下瀚高的同事, 效率很高并且说明的很完整) 瀚高是基于postgresql数据库做的深度定制开发的国产数据库. 不仅仅支持x86 也支持龙芯等全国产安 ...
- t-sql最短路径搜索
SET STATISTICS IO ON; SET STATISTICS TIME ON; GO IF OBJECT_ID(N'dbo.t1') IS NOT NULL DROP TABLE dbo. ...
- 日期和时间(datetime模块)
前言: 参考:https://blog.csdn.net/weixin_42232219/article/details/89838580 在 python 中,datetime 是对日期数据进行处理 ...
- python基础数据类型和初级应用
1.整数: int -- 计算和比较 2 -- 10 推位 8421 20 21 -- 2**7 10 - 2 bit_length 二进制的有效占用位数 # 123 # 计算和比较 # 14 0 # ...
- ado.net SqlHelp类
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...