题意:给定一个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. python计算机二级考试知识点——文件操作

    1. 文件的使用:文件打开.关闭和读写 python通过open函数打开一个文件,并返回一个操作文件的变量,语法形式如下: <变量名>=open(<文件路劲及文件名>,< ...

  2. css中元素定位

    在html中网页可以看成一个立体的空间,一个完整的页面是由很多个页面堆积形成的,如下图所示 CSS中Position属性有四个可选值,它们分别是:static.absolute.fixed.relat ...

  3. sublime text 修改侧边栏字体大小

    ctrl+shift_p 安装PackageResourceViewer,通过**PackageResourceViewer **这个插件来实现. 打开这个插件,选择Open Resource 输入T ...

  4. SolidWorks学习笔记1

    鼠标 修改缩放方向 点击工具->选项->视图,点击第一条,翻转鼠标滚轮缩放方向. 平移:Ctrl+ 中键 或者右键空白处 菜单选择平移 缩放:Shift+中键 或者右键空白处 菜单选择放大 ...

  5. 接口自动化框架 - httprunner 引用unittest

    httprunner其中一个比较好的点就是利用type动态创建类,使用setattr动态增加方法和属性. 将维护的用例进行转变为继承unittest.Textcase的类,很好的与unittest结合 ...

  6. JavaScript中好用的对象数组去重

    对象数组去重 Demo数据如下: var items= [{ "specItems": [{ "id": "966480614728069122&qu ...

  7. # 模乘(解决乘法取模爆long long)

    模乘(解决乘法取模爆long long) 二进制思想,变乘法为多次加法,具体思想跟着代码手算一遍就理解了,挺简单的 ll qmul(ll a,ll b,ll m) { ll ans=0; while( ...

  8. java web 二维码生成

    pom支持: <!-- 二维码支持包 start--> <dependency> <groupId>com.google.zxing</groupId> ...

  9. Asp.net4.5未在web服务器上注册

    在使用vs2012打开项目时,显示Asp.net4.5未在web服务器上注册?是由于没有下载一个补丁的原因,只需下载安装补丁 VS11-KB3002339.exe 下载地址:https://downl ...

  10. 03 Redis发布与订阅

    以qq群的公告,单个发布者,多个收听者为例 发布/订阅 实验 发布订阅的命令 PUBLISH channel msg 将信息 message 发送到指定的频道 channel SUBSCRIBE ch ...