题意:给定一个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. 【.NET】无法加载协定为“ServiceReference1.ReportWsSoap”的终结点配置部分,因为找到了该协定的多个终结点配置。请按名称指示首选的终结点配置部分。

    前言 引用websevice时,有时会出现如下错误: 异常详细信息: System.InvalidOperationException: 无法加载协定为“ServiceReference1.Repor ...

  2. python3.4 + pycharm安装与使用

    因个人是windows的环境,所以本文只讲windows环境下的python安装. 作为初用python的盆友,强烈建议只在电脑上装一个python版本就好了,不然就进了各种坑里了. Python安装 ...

  3. 【AMAD】django-filer -- 一个管理文件和图片的django app

    动机 简介 个人评分 动机 django-filer1可以让你像一些云存储一样使用WEB UI控制你的文件. 简介 下面是前端图片:   个人评分 类型 评分 实用性 ⭐️⭐️⭐️⭐️ 易用性 ⭐ ...

  4. 在Debian下利用URLOS快速安装SqlServer2017

    SqlServer能在Debian上安装吗?答案是可以!网络上也能找到很多Linux系统下安装SqlServer的相关文章,也许经过一些折腾,你也能成功在Debian中安装sqlserver,但是其中 ...

  5. vue中 Vue.set 的使用

    Vue.set(vm.items, indexOfItem, newValue) 1.vm.items :源数据:2.indexOfItem : 要修改的数据的键3.newValue : 要修改的数据 ...

  6. java 实现读取某个目录下指定类型的文件

    我这里是读取txt类型的文件,在指定的目录下有不同类型的文件 实现代码,读取txt类型的文件并打印出该文件的绝对路径 package com.SBgong.test; import java.io.F ...

  7. (5.4)mysql高可用系列——MySQL异步复制(实践)

    关键词:mysql复制,mysql异步复制,mysql传统异步复制 [1]实验环境 操作系统:CentOS linux 7.5 数据库版本:5.7.24 数据库架构:主从复制,主库用于生产,从库用于数 ...

  8. 阿里云对象存储OSS

    阿里云的产品种类繁多,今天让我们一起来了解下对象存储(Object Storage Service,简称OSS)吧! 什么是对象存储呢? 简单来说,对象存储OSS是阿里云提供的海量.安全和高可靠的云存 ...

  9. Ubuntu19.04系统SSH连接CentOS7虚拟机

    一.为CentOS7配置静态IP 注意查看宿主机(Ubuntu19.04)所在局域网段,当前为172.18.25.108 修改当前系统下virtual box的网络设置 [控制]-->[设置]- ...

  10. python打印带颜色的字体

    在python开发的过程中,经常会遇到需要打印各种信息.海量的信息堆砌在控制台中,就会导致信息都混在一起,降低了重要信息的可读性.这时候,如果能给重要的信息加上字体颜色,那么就会更加方便用户阅读了. ...