hdu_5889_Barricade(最小割+最短路)
题目链接:hdu_5889_Barricade
题意:
有n个点,m条边,每个边的长度都为1,每个边有一个消耗w,如果要阻断这条路,那么就会消耗w,现在让你阻断点1到点n的所有最短路,问你最小的消耗是多少
题解:
先用dij算出最短路,然后再枚举每一条边,如果dis[u]+1=dis[v],那么久在网络流里加一条u到v的边,消耗为w,
最后用板子跑一下最大流就行了
#include<bits/stdc++.h>
#define F(i,a,b) for(int i=a;i<=b;++i)
using namespace std; #define MAXN 20010//边数
#define inf 10000000
int t,n,m,x,y,c,egg[MAXN][];
int v[MAXN], w[MAXN], nxt[MAXN], gg[MAXN], ed, dd[MAXN];//n为点数,d为起点到每点的最短路程,初始化ed为0,g初始化为0
void adg(int x, int y, int z) { v[++ed] = y; w[ed] = z; nxt[ed] = gg[x]; gg[x] = ed;}
typedef pair<int, int>P;
priority_queue<P, vector<P>, greater<P> > Q;
void dijkstra(int S) {
int i, x;
for (i = ; i <= n; i++)dd[i] = inf; Q.push(P(dd[S] = , S));
while (!Q.empty()) {
P t = Q.top(); Q.pop();
if (dd[x = t.second] < t.first)continue;
for (i = gg[x]; i; i = nxt[i])if (dd[x] + w[i] < dd[v[i]])Q.push(P(dd[v[i]] = dd[x] + w[i], v[i]));
}
} const int N=,M=;
struct edge{int t,f;edge*nxt,*pair;}*g[N],*d[N],pool[M],*cur=pool;
struct ISAP{
int n,m,i,S,T,h[N],gap[N],maxflow;
void init(int ss,int tt){for(S=ss,T=tt,cur=pool,i=;i<=T;i++)g[i]=d[i]=NULL,h[i]=gap[i]=;}
void add(int s,int t,int f){
edge*p=cur++;p->t=t,p->f=f,p->nxt=g[s],g[s]=p;
p=cur++,p->t=s,p->f=,p->nxt=g[t],g[t]=p;
g[s]->pair=g[t],g[t]->pair=g[s];
}
int sap(int v,int flow){
if(v==T)return flow;
int rec=;
for(edge*p=d[v];p;p=p->nxt)if(h[v]==h[p->t]+&&p->f){
int ret=sap(p->t,min(flow-rec,p->f));
p->f-=ret;p->pair->f+=ret;d[v]=p;
if((rec+=ret)==flow)return flow;
}
if(!(--gap[h[v]]))h[S]=T;
gap[++h[v]]++;d[v]=g[v];
return rec;
}
int get_ans(){
for(gap[maxflow=]=T,i=;i<=T;i++)d[i]=g[i];
while(h[S]<T)maxflow+=sap(S,inf);
return maxflow;
}
}G; int main(){
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
G.init(,n);
memset(gg,,sizeof(gg)),ed=;
F(i,,m)
{
scanf("%d%d%d",&x,&y,&c),adg(x,y,),adg(y,x,);
egg[i][]=x,egg[i][]=y,egg[i][]=c;
}
dijkstra();
F(i,,m)
{
if(dd[egg[i][]]+==dd[egg[i][]])G.add(egg[i][],egg[i][],egg[i][]);
if(dd[egg[i][]]+==dd[egg[i][]])G.add(egg[i][],egg[i][],egg[i][]);
}
printf("%d\n",G.get_ans());
}
}
hdu_5889_Barricade(最小割+最短路)的更多相关文章
- BZOJ 2007 海拔(平面图最小割-最短路)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2007 题意:给出一个n*n的格子,那么顶点显然有(n+1)*(n+1)个.每两个相邻顶点 ...
- HDU - 3035 War(对偶图求最小割+最短路)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3035 题意 给个图,求把s和t分开的最小割. 分析 实际顶点和边非常多,不能用最大流来求解.这道题要用 ...
- BZOJ1001 BJOI2006狼抓兔子(最小割+最短路)
显然答案就是最小割.直接跑dinic也能过,不过显得不太靠谱. 考虑更正确的做法.作为一个平面图,如果要把他割成两半,那么显然可以用一条曲线覆盖且仅覆盖所有割边.于是我们把空白区域看成点,隔开他们的边 ...
- bzoj 1001 狼抓兔子 —— 平面图最小割(最短路)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1001 平面图最小割可以转化成最短路问题: 建图时看清楚题目的 input ... 代码如下: ...
- 【BZOJ-2007】海拔 最小割 (平面图转对偶图 + 最短路)
2007: [Noi2010]海拔 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2095 Solved: 1002[Submit][Status] ...
- HDU3870 Catch the Theves(平面图最小割转最短路)
题目大概说给一个n×n的方格,边有权值,问从求(1,1)到(n,n)的最小割. 点达到了160000个,直接最大流不好.这题的图是平面图,求最小割可以转化成求其对偶图的最短路,来更高效地求解: 首先源 ...
- UVALive 3661 Animal Run(最短路解最小割)
题意:动物要逃跑,工作人员要截断从START(左上角)到END(右下角)的道路,每条边权表示拦截该条道路需要多少工作人员.问最少需要多少人才能完成拦截. 通俗地讲,就是把图一分为二所造成消耗的最小值. ...
- BZOJ_1001_狼抓兔子_(平面图求最小割+对偶图求最短路)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1001 1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec ...
- [BZOJ 2007] [Noi2010] 海拔 【平面图最小割(对偶图最短路)】
题目链接:BZOJ - 2007 题目分析 首先,左上角的高度是 0 ,右下角的高度是 1.那么所有点的高度一定要在 0 与 1 之间.然而选取 [0, 1] 的任何一个实数,都可以用整数 0 或 1 ...
随机推荐
- Java基础知识之文件操作
流与文件的操作在编程中经常遇到,与C语言只有单一类型File*即可工作良好不同,Java拥有一个包含各种流类型的流家族,其数量超过60个!当然我们没必要去记住这60多个类或接口以及它们的层次结构,理解 ...
- Ubuntu 14.04 登陆界面循环问题解决
今天手贱startx然后虚拟机就卡死了,再开输过密码就无限跳到登陆界面,其他账户可用.怀疑/home未挂载. 解决方法:(alf改成你的用户名) $ cd ~$ sudo chown alf:alf. ...
- Java学习笔记-File
//文件操作 //2015年4月30日15:40:21 package com.alfredsun.first.main; import java.io.File; import java.io.IO ...
- CAD打开缓慢问题解决方法
打开AutoCAD很卡,大概需要1分钟 打开Internet Explorer,点击工具菜单,打开"Internet选项",去勾选"检查发行商的证书是否吊销", ...
- iOS-延迟操作方法总结
在实际应用中,有时候我们会需要延时执行某些操作,所以我们这里总结了四种延迟操作的方法,并简要分析了每种方法的异同. NSObject的相关方法 第一种方法是使用NSObject类的performSel ...
- FTP上传下载工具(FlashFXP) v5.5.0 中文版
软件名称: FTP上传下载工具(FlashFXP) 软件语言: 简体中文 授权方式: 免费试用 运行环境: Win 32位/64位 软件大小: 7.4MB 图片预览: 软件简介: FlashFXP 是 ...
- C++的第一天
第一次写博客,第一天的C++,从第一讲视屏中了解到了,类,对象,oop编程思想 1.类包括对象和对象的行为,对象具有静态连接(对象的名字)和动态链接(对象的行为),视屏中提到了多态性,应该是不同的类具 ...
- document对象相关的几个常用的方法
方法 描述 var newP=createElement("p"); 创建了一个p标签,p也可替换为div,span等 var oldTxt=createTextNode(&qu ...
- 多线程随笔二(Task)
Task类是.net 4.0新加进来的特性,对原有的Thread,ThreadPool做了进一步的封装,使得.net平台上的多线程编程变得更加方便.废话不多说,进入正题. 一. Task启动 Task ...
- es6语法
let定义变量,特性: 1,不允许重复定义 2,不存在预解析 3,变量存在于会块级作用域 即{}内部 const : 定义常量,常量的值不能修改,若常量是对象 对象下的属性可修改. 解构赋值语法: 数 ...