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 ...
随机推荐
- 相对协议-关于src里//开头的知识
"相对协议",也就是链接以 // 开头,前面去掉了 http: 或 https: 字样, 这样做的好处是浏览器能够根据你的网站所采用的协议来自动加载 CDN 上托管的文件!
- flume 以 kafka 为channel 的配置
#此配置以kafka的一个topic为channel,相比其他channel类型 file和cache 兼并了快和安全的要求!# Define a kafka channel a1.channels. ...
- erlang虚拟机代码执行原理
转载:http://blog.csdn.NET/mycwq/article/details/45653897 erlang是开源的,很多人都研究过源代码.但是,从erlang代码到c代码,这是个不小 ...
- WebForm 分页与组合查询
1.封装实体类 2.写查询方法 //SubjectData类 public List<Subject> Select(string name) { List<Subject> ...
- WPF中自定义绘制内容
先说结论:实现了在自定义大小的窗口中,加载图片,并在图片上绘制一个矩形框:且在窗口大小改变的情况,保持绘制的矩形框与图片的先对位置不变. 在WinForm中,我们可以很方便地绘制自己需要的内容,在WP ...
- 两种画线算法(DDA&Bersenham)
DDA(digital differential analyzer) 由直线的斜截式方程引入 对于正斜率的线段,如果斜率<=1,则以单位x间隔(δx=1)取样,并逐个计算每一个y值 Yk+1 = ...
- c# 操作xml之xmlReader
xmlReader的名称空间using System.Xml; xmlReader是通过流的方式来读取xml文件的内容 <?xml version="1.0" encodin ...
- Android记住密码自动登录的实现
我采用的是SharedPreferences来存取数据的,所以先简单的介绍一下SharedPreferences SharedPreferences是Android平台上一个轻量级的存储类,主要是保存 ...
- 基于AFN的多张图片上传
不废话,直接上代码 NSString *urlString = [NSString stringWithFormat:@"http://192.168.1.166:8080/Discipli ...
- 关于mongodb的一些笔记
1.以服务的形式安装mongodb dos -- 进入到mongodb的bin目录下,执行 D:\mongodb\bin>mongod --logpath D:\mongodb\logs\mon ...