zoukankan      html  css  js  c++  java
  • bzoj1927最小费用最大流

    其实本来打算做最小费用最大流的题目前先来点模板题的,,,结果看到这道题二话不说(之前打太多了)敲了一个dinic,快写完了发现不对

    我当时就这表情→   =_=你TM逗我

    刚要删突然感觉dinic的模板中的bfs就相当于找每天边的权都为1的图上的最短路,稍稍改一下就能变成spfa,于是重新写了一下,但是函数名还是bfs。。。

    然后又发现不对,最后要返回路径的,dfs也要改= =结果变成了非递归,但是函数名还是dfs。。。

    于是一个看似是dinic,实则垃圾得不行的最小费用最大流就敲完了

    然后调了一小会儿,最后发现我把入点和入点连了起来。。。难怪每次算出来都是直接飞

     1 #include <cstdio>
     2 #include <iostream>
     3 #define INF 2147483647
     4 using namespace std;
     5 int n,m,N=1,ans=0,x,y,z,h,t,i,minflow,now;
     6 int fir[3000],nex[50000],to[50000],flo[50000],cost[50000],d[3000],l[30000],father[3000];
     7 bool que[3000];
     8 inline void add(int a,int b,int c,int d){    nex[++N]=fir[a];fir[a]=N;to[N]=b;flo[N]=c;cost[N]=d;
     9                                             nex[++N]=fir[b];fir[b]=N;to[N]=a;flo[N]=0;cost[N]=-d;}
    10 bool bfs()//其实是spfa 
    11 {
    12     for(int i=1;i<=n*2+2;i++) d[i]=INF;
    13     for(h=1,t=1,l[1]=n*2+1,d[n*2+1]=0;h<=t;h++)
    14         for (que[l[h]]=0,i=fir[l[h]];i;i=nex[i])
    15         if(flo[i] && d[to[i]]>d[l[h]]+cost[i])
    16         {
    17             father[to[i]]=i;//注意father存的是边 
    18             d[to[i]]=d[l[h]]+cost[i];
    19             if (!que[to[i]])
    20                 l[++t]=to[i],que[to[i]]=1;
    21         }
    22     return d[n*2+2]!=INF;
    23 }
    24  
    25 void dfs()//其实写成了非递归 
    26 {
    27     for(minflow=INF,now=n*2+2;now!=n*2+1;now=to[father[now]^1])
    28         minflow=min(minflow,flo[father[now]]);
    29     for(now=n*2+2;now!=n*2+1;now=to[father[now]^1])
    30         ans+=cost[father[now]],flo[father[now]]-=minflow,flo[father[now]^1]+=minflow;
    31 }
    32  
    33 int main() 
    34 {
    35     scanf("%d%d",&n,&m);
    36     for (int i=1;i<=n;i++)
    37         scanf("%d",&x),add(n*2+1,i+n,1,x);
    38     for (int i=1;i<=n;i++)
    39         add(n*2+1,i,1,0);
    40     for (int i=1;i<=m;i++)
    41         scanf("%d%d%d",&x,&y,&z),add(min(x,y),max(x,y)+n,1,z);
    42     for (int i=1;i<=n;i++)
    43         add(i+n,n*2+2,1,0);
    44     while (bfs()) dfs();
    45     printf("%d
    ",ans);
    46     return 0;
    47 }
  • 相关阅读:
    Linux下的文件批量转换为UTF8编码-enca
    【转】valgrind的简介以及安装
    springboot2.0整合logback日志(详细)
    springboot整合redis
    用Thymeleaf在实际项目中遇到的坑
    RedisTemplate和StringRedisTemplate的区别
    @EnableCircuitBreaker熔断超时机制
    eclipse转到idea过程中的基本设置...
    java.lang.NoSuchMethodError
    springcloud服务提供producer and 服务调用consumer
  • 原文地址:https://www.cnblogs.com/wanglichao/p/5822160.html
Copyright © 2011-2022 走看看