题目链接:hdu_5889_Barricade

题意:

有n个点,m条边,每个边的长度都为1,每个边有一个消耗w,如果要阻断这条路,那么就会消耗w,现在让你阻断点1到点n的所有最短路,问你最小的消耗是多少

题解:

先用dij算出最短路,然后再枚举每一条边,如果dis[u]+1=dis[v],那么久在网络流里加一条u到v的边,消耗为w,

最后用板子跑一下最大流就行了

  1. #include<bits/stdc++.h>
  2. #define F(i,a,b) for(int i=a;i<=b;++i)
  3. using namespace std;
  4.  
  5. #define MAXN 20010//边数
  6. #define inf 10000000
  7. int t,n,m,x,y,c,egg[MAXN][];
  8. int v[MAXN], w[MAXN], nxt[MAXN], gg[MAXN], ed, dd[MAXN];//n为点数,d为起点到每点的最短路程,初始化ed为0,g初始化为0
  9. void adg(int x, int y, int z) { v[++ed] = y; w[ed] = z; nxt[ed] = gg[x]; gg[x] = ed;}
  10. typedef pair<int, int>P;
  11. priority_queue<P, vector<P>, greater<P> > Q;
  12. void dijkstra(int S) {
  13. int i, x;
  14. for (i = ; i <= n; i++)dd[i] = inf; Q.push(P(dd[S] = , S));
  15. while (!Q.empty()) {
  16. P t = Q.top(); Q.pop();
  17. if (dd[x = t.second] < t.first)continue;
  18. 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]));
  19. }
  20. }
  21.  
  22. const int N=,M=;
  23. struct edge{int t,f;edge*nxt,*pair;}*g[N],*d[N],pool[M],*cur=pool;
  24. struct ISAP{
  25. int n,m,i,S,T,h[N],gap[N],maxflow;
  26. 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]=;}
  27. void add(int s,int t,int f){
  28. edge*p=cur++;p->t=t,p->f=f,p->nxt=g[s],g[s]=p;
  29. p=cur++,p->t=s,p->f=,p->nxt=g[t],g[t]=p;
  30. g[s]->pair=g[t],g[t]->pair=g[s];
  31. }
  32. int sap(int v,int flow){
  33. if(v==T)return flow;
  34. int rec=;
  35. for(edge*p=d[v];p;p=p->nxt)if(h[v]==h[p->t]+&&p->f){
  36. int ret=sap(p->t,min(flow-rec,p->f));
  37. p->f-=ret;p->pair->f+=ret;d[v]=p;
  38. if((rec+=ret)==flow)return flow;
  39. }
  40. if(!(--gap[h[v]]))h[S]=T;
  41. gap[++h[v]]++;d[v]=g[v];
  42. return rec;
  43. }
  44. int get_ans(){
  45. for(gap[maxflow=]=T,i=;i<=T;i++)d[i]=g[i];
  46. while(h[S]<T)maxflow+=sap(S,inf);
  47. return maxflow;
  48. }
  49. }G;
  50.  
  51. int main(){
  52. scanf("%d",&t);
  53. while(t--){
  54. scanf("%d%d",&n,&m);
  55. G.init(,n);
  56. memset(gg,,sizeof(gg)),ed=;
  57. F(i,,m)
  58. {
  59. scanf("%d%d%d",&x,&y,&c),adg(x,y,),adg(y,x,);
  60. egg[i][]=x,egg[i][]=y,egg[i][]=c;
  61. }
  62. dijkstra();
  63. F(i,,m)
  64. {
  65. if(dd[egg[i][]]+==dd[egg[i][]])G.add(egg[i][],egg[i][],egg[i][]);
  66. if(dd[egg[i][]]+==dd[egg[i][]])G.add(egg[i][],egg[i][],egg[i][]);
  67. }
  68. printf("%d\n",G.get_ans());
  69. }
  70. }

hdu_5889_Barricade(最小割+最短路)的更多相关文章

  1. BZOJ 2007 海拔(平面图最小割-最短路)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2007 题意:给出一个n*n的格子,那么顶点显然有(n+1)*(n+1)个.每两个相邻顶点 ...

  2. HDU - 3035 War(对偶图求最小割+最短路)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3035 题意 给个图,求把s和t分开的最小割. 分析 实际顶点和边非常多,不能用最大流来求解.这道题要用 ...

  3. BZOJ1001 BJOI2006狼抓兔子(最小割+最短路)

    显然答案就是最小割.直接跑dinic也能过,不过显得不太靠谱. 考虑更正确的做法.作为一个平面图,如果要把他割成两半,那么显然可以用一条曲线覆盖且仅覆盖所有割边.于是我们把空白区域看成点,隔开他们的边 ...

  4. bzoj 1001 狼抓兔子 —— 平面图最小割(最短路)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1001 平面图最小割可以转化成最短路问题: 建图时看清楚题目的 input ... 代码如下: ...

  5. 【BZOJ-2007】海拔 最小割 (平面图转对偶图 + 最短路)

    2007: [Noi2010]海拔 Time Limit: 20 Sec  Memory Limit: 552 MBSubmit: 2095  Solved: 1002[Submit][Status] ...

  6. HDU3870 Catch the Theves(平面图最小割转最短路)

    题目大概说给一个n×n的方格,边有权值,问从求(1,1)到(n,n)的最小割. 点达到了160000个,直接最大流不好.这题的图是平面图,求最小割可以转化成求其对偶图的最短路,来更高效地求解: 首先源 ...

  7. UVALive 3661 Animal Run(最短路解最小割)

    题意:动物要逃跑,工作人员要截断从START(左上角)到END(右下角)的道路,每条边权表示拦截该条道路需要多少工作人员.问最少需要多少人才能完成拦截. 通俗地讲,就是把图一分为二所造成消耗的最小值. ...

  8. BZOJ_1001_狼抓兔子_(平面图求最小割+对偶图求最短路)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1001 1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec   ...

  9. [BZOJ 2007] [Noi2010] 海拔 【平面图最小割(对偶图最短路)】

    题目链接:BZOJ - 2007 题目分析 首先,左上角的高度是 0 ,右下角的高度是 1.那么所有点的高度一定要在 0 与 1 之间.然而选取 [0, 1] 的任何一个实数,都可以用整数 0 或 1 ...

随机推荐

  1. 相对协议-关于src里//开头的知识

    "相对协议",也就是链接以 // 开头,前面去掉了 http: 或 https: 字样, 这样做的好处是浏览器能够根据你的网站所采用的协议来自动加载 CDN 上托管的文件!

  2. flume 以 kafka 为channel 的配置

    #此配置以kafka的一个topic为channel,相比其他channel类型 file和cache 兼并了快和安全的要求!# Define a kafka channel a1.channels. ...

  3. erlang虚拟机代码执行原理

     转载:http://blog.csdn.NET/mycwq/article/details/45653897 erlang是开源的,很多人都研究过源代码.但是,从erlang代码到c代码,这是个不小 ...

  4. WebForm 分页与组合查询

    1.封装实体类 2.写查询方法 //SubjectData类 public List<Subject> Select(string name) { List<Subject> ...

  5. WPF中自定义绘制内容

    先说结论:实现了在自定义大小的窗口中,加载图片,并在图片上绘制一个矩形框:且在窗口大小改变的情况,保持绘制的矩形框与图片的先对位置不变. 在WinForm中,我们可以很方便地绘制自己需要的内容,在WP ...

  6. 两种画线算法(DDA&Bersenham)

    DDA(digital differential analyzer) 由直线的斜截式方程引入 对于正斜率的线段,如果斜率<=1,则以单位x间隔(δx=1)取样,并逐个计算每一个y值 Yk+1 = ...

  7. c# 操作xml之xmlReader

    xmlReader的名称空间using System.Xml; xmlReader是通过流的方式来读取xml文件的内容 <?xml version="1.0" encodin ...

  8. Android记住密码自动登录的实现

    我采用的是SharedPreferences来存取数据的,所以先简单的介绍一下SharedPreferences SharedPreferences是Android平台上一个轻量级的存储类,主要是保存 ...

  9. 基于AFN的多张图片上传

    不废话,直接上代码 NSString *urlString = [NSString stringWithFormat:@"http://192.168.1.166:8080/Discipli ...

  10. 关于mongodb的一些笔记

    1.以服务的形式安装mongodb dos -- 进入到mongodb的bin目录下,执行 D:\mongodb\bin>mongod --logpath D:\mongodb\logs\mon ...