题意:给定一个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. Linux后台运行python程序并输出到日志文件

    后台运行python程序并标准输出到文件 现在有test.py程序要后台部署, 里面有输出内容 使用命令: nohup python -u test.py > test.log 2>&am ...

  2. 应用安全 - 编程语言 | 框架 - PHP - Djiango - 漏洞 -汇总

    CVE-2007-0404 Date , 类型Filename validation issue in translation framework. Full description 影响范围 CVE ...

  3. 强大的项目管理工具maven

    大概功能:构建项目,管理jar包,编译代码,自动运行单元测试.打包.生成报表,部署项目,生成web站点. 重要功能:依赖管理(maven对jar包的管理过程,能够大大的节约磁盘空间).项目的一键构建. ...

  4. [c++] 幂法求特征向量

    幂法的原理可参考此篇论文:http://d.wanfangdata.com.cn/Periodical/hnnydxxb2001Z1023 本文求解的是 3 阶矩阵最大特征值及其特征向量 下面是其 C ...

  5. Java基础(九)

    综合案例 此前我们已经练习了根据集合当中的字符串对象读写文件,而本综合案例主要练习根据集合当中的自定义对象来读写文件. 场景介绍 很多网络游戏当中都有组队模式,例如魔兽世界.DotA.英雄联盟(LOL ...

  6. 深入理解分布式系统的2PC和3PC

    协调者 在分布式系统中,每一个机器节点虽然都能明确的知道自己执行的事务是成功还是失败,但是却无法知道其他分布式节点的事务执行情况.因此,当一个事务要跨越多个分布式节点的时候(比如,淘宝下单流程,下单系 ...

  7. GDOI2018游记

    前言 不知怎的,本蒟蒻居然拿到了GDOI参赛名额 于是乎,我稀里糊涂地跟着诸位大佬屁颠屁颠地来到了阔别已久的中山一中 腐败difficult and interesting的GDOI比赛就这样开始了. ...

  8. 编译LAMP部署动态网站环境

    LAMP动态网站部署架构是由一套 Linux+Apache+MySQL+PHP 组成的动态网站系统解决方案. 以下配置环境为:Linux=RHEL7 --> Apache=2.4.33 --&g ...

  9. python网络爬虫(7)爬取静态数据详解

    目的 爬取http://seputu.com/数据并存储csv文件 导入库 lxml用于解析解析网页HTML等源码,提取数据.一些参考:https://www.cnblogs.com/zhangxin ...

  10. POI操作OFFICE转HTML

    由于项目需求,需要上传在线预览生成的office文件,经过一番痛苦的研究,目前已经成功将DOC.DOCX.PPTX不乱码转换成功,PPT当字体不是宋体时出现乱码,至今无法解决,待日后再研究吧.而EXC ...