zoukankan      html  css  js  c++  java
  • P3376 【模板】网络最大流(当前弧优化版dinic做法)

    https://www.luogu.org/problem/P3376

    模板题,dinic做法

     1 #define bug(x) cout<<#x<<" is "<<x<<endl
     2 #define IO std::ios::sync_with_stdio(0)
     3 #include <bits/stdc++.h>
     4 #define iter ::iterator
     5 #define pa pair<int,int>
     6 using namespace  std;
     7 #define ll long long
     8 #define mk make_pair
     9 #define pb push_back
    10 #define se second
    11 #define fi first
    12 #define ls o<<1
    13 #define rs o<<1|1
    14 ll mod=998244353;
    15 const int inf=2e9+10;
    16 const int N=1e5+5,M=4e5+5;
    17 struct node{
    18     int cnt;
    19     int head[N];
    20     int nex[M];
    21     int W[M];
    22     int V[M];
    23     int dep[N];
    24     int cur[N];
    25     int n,s,t;
    26     void init(){
    27         cnt=-1;
    28         memset(head,-1,sizeof(head));
    29         memset(nex,-1,sizeof(nex));
    30     }
    31     void _add(int u,int v,int w){
    32         cnt++;
    33         nex[cnt]=head[u];
    34         head[u]=cnt;
    35         V[cnt]=v;
    36         W[cnt]=w;
    37     }
    38     void add(int u,int v,int w){
    39         _add(u,v,w);
    40         _add(v,u,0);
    41     }
    42     int dfs(int u,int flow){
    43         if(u==t)return flow;
    44         for(int i=cur[u];i!=-1;i=nex[i]){
    45             if((dep[V[i]])==dep[u]+1&&W[i]){
    46                 int di=dfs(V[i],min(flow,W[i]));
    47                 if(di>0){
    48                     W[i]-=di;
    49                     W[i^1]+=di;
    50                     return di;
    51                 }
    52             }
    53         }
    54         return 0;
    55     }
    56     int bfs(){
    57         queue<int>q;
    58         memset(dep,0,sizeof(dep));
    59         dep[s]=1;
    60         q.push(s);
    61         while(!q.empty()){
    62             int u=q.front();
    63             q.pop();
    64             for(int i=head[u];i!=-1;i=nex[i]){
    65                 if(!dep[V[i]]&&W[i]>0){
    66                     dep[V[i]]=dep[u]+1;
    67                     q.push(V[i]);
    68                 }
    69             }
    70         }
    71         if(dep[t]>0)return 1;
    72         return 0;
    73     }
    74     int dinic(){
    75         int res=0;
    76         while(bfs()){
    77             for(int i=1;i<=n;i++)cur[i]=head[i];
    78             while(int d=dfs(s,inf))res+=d;
    79         }
    80         return res;
    81     }
    82 };
    83 int main(){
    84     int n,m,s,t;
    85     scanf("%d%d%d%d",&n,&m,&s,&t);
    86     node ac;
    87     ac.init();
    88     ac.n=n;
    89     ac.s=s;
    90     ac.t=t;
    91     for(int i=1;i<=m;i++){
    92         int x,y,z;
    93         scanf("%d%d%d",&x,&y,&z);
    94         ac.add(x,y,z);
    95     }
    96     printf("%d
    ",ac.dinic());
    97 }
  • 相关阅读:
    Lab BGP RTBH
    Lab BGP ORF
    Lab BGP Maximum-Prefix
    Lab BGP 路由翻动(route flaps)
    Lab BGP Peer-Group
    Lab BGP Dampening
    BGP Dampening Cyrus
    BGP进程工作步骤
    5、为什么域名解析用UDP协议?6、为什么区域传送用TCP协议?
    3、你知道DNS是什么?4、DNS的工作原理?
  • 原文地址:https://www.cnblogs.com/ccsu-kid/p/11509032.html
Copyright © 2011-2022 走看看