• 图论专题A (网络流)


    需要跑多遍的网络流,一个是注意bfs的时候deep不能用memset赋值,一个是每一次网络流的过程都会带来wei和cur的改变

     1 #include "bits/stdc++.h"
     2 using namespace std;
     3 typedef long long LL;
     4 const LL MAX=1e6+5;
     5 LL n,m,s,t,ans;
     6 LL tot,head[MAX],adj[MAX*6],wei[MAX*6],nxt[MAX*6];
     7 LL deep[MAX],cur[MAX];
     8 inline LL read(){
     9     LL an=0,x=1;char c=getchar();
    10     while (c<'0' || c>'9') {if (c=='-') x=-1;c=getchar();}
    11     while (c>='0' && c<='9') {an=(an<<3)+(an<<1)+c-'0';c=getchar();}
    12     return an*x;
    13 }
    14 void addedge(LL u,LL v,LL w){
    15     tot++;adj[tot]=v,wei[tot]=w,nxt[tot]=head[u],head[u]=tot;
    16 }
    17 bool bfs(){
    18     LL i,j,u;
    19     for (i=1;i<=n;i++) deep[i]=1e9+10;
    20     deep[s]=0;
    21     queue <LL> q;
    22     while (!q.empty()) q.pop();
    23     q.push(s);
    24     while (!q.empty()){
    25         u=q.front();q.pop();
    26         for (i=head[u];i;i=nxt[i]){
    27             if (deep[adj[i]]>1e9 && wei[i]>0)
    28                 deep[adj[i]]=deep[u]+1,q.push(adj[i]);
    29         }
    30     }
    31     return deep[t]<1e9;
    32 }
    33 LL dfs(LL x,LL flo){
    34     if (x==t || flo==0) return flo;
    35     LL j;
    36     for (LL &i=cur[x];i;i=nxt[i])
    37         if (deep[adj[i]]==deep[x]+1 && wei[i]>0){
    38             j=dfs(adj[i],min(flo,wei[i]));
    39             if (j) return wei[i]-=j,wei[i^1]+=j,j;
    40         }
    41     return 0;
    42 }
    43 int main(){
    44     freopen ("a.in","r",stdin);freopen ("a.out","w",stdout);
    45     LL i,j,u,v,w;
    46     n=read();m=read();
    47     LL flow=0,dd;ans=1e9;
    48     tot=1;
    49     for (i=1;i<=m;i++){
    50         u=read();v=read();
    51         addedge(u,v,1);
    52         addedge(v,u,1);
    53     }
    54     for (i=1;i<=n;i++) cur[i]=head[i];
    55     for (t=2;t<=n;t++){
    56         s=1;
    57         for (i=1;i<=tot;i++) wei[i]=1;
    58         flow=0;
    59         while (bfs()){
    60             for (i=1;i<=n;i++) cur[i]=head[i];
    61             while (dd=dfs(s,1e9)) flow+=dd;
    62         }
    63         ans=min(ans,flow);
    64     }
    65     printf("%lld",ans);
    66     return 0;
    67 }
  • 相关阅读:
    Kafka文件存储机制及offset存取
    Kafka基本架构及原理
    Spark性能优化指南——基础篇
    SparkStreaming:关于checkpoint的弊端
    SparkStreaming基本架构及使用
    Spark RDD、DataFrame原理及操作详解
    Spark 广播变量BroadCast
    Spark基本架构及原理
    Spark On Yarn的两种模式yarn-cluster和yarn-client深度剖析
    大数据架构:搭建CDH5.5.1分布式集群环境
  • 原文地址:https://www.cnblogs.com/keximeiruguo/p/16131738.html
Copyright © 2020-2023  润新知