zoukankan      html  css  js  c++  java
  • [loj#101] 最大流 网络流模板

    #101. 最大流

    内存限制:512 MiB时间限制:5000 ms标准输入输出
    题目类型:传统评测方式:文本比较
    上传者: 匿名

    题目描述

    这是一道模板题。

    给定 n nn 个点,m mm 条边,给定每条边的容量,求从点 s ss 到点 t tt 的最大流。

    输入格式

    第一行四个整数 n nn、m mm、s ss、t tt。
    接下来的 m mm 行,每行三个整数 u uu、v vv、c cc,表示 u uu 到 v vv,流量为 c cc 的一条边。

    输出格式

    输出点 s ss 到点 t tt 的最大流。

    样例

    样例输入

    7 14 1 7
    1 2 5
    1 3 6
    1 4 5
    2 3 2
    2 5 3
    3 2 2
    3 4 3
    3 5 3
    3 6 7
    4 6 5
    5 6 1
    6 5 1
    5 7 8
    6 7 7

    样例输出

    14

    数据范围与提示

    1≤n≤106,1≤m≤4×106,0≤c≤231−1 1 leq n leq 10 ^ 6, 1 leq m leq 4 imes 10 ^ 6, 0 leq c leq 2 ^ {31} - 11n106​​,1m4×106​​,0c231​​1

     1 #include<iostream>
     2 #include<cstring>
     3 #include<cstdio>
     4 #include<cstdlib>
     5 #include<cmath>
     6 #include<algorithm>
     7 #define maxm 4000006
     8 #define maxn 1000006
     9 using namespace std;
    10 int read() {
    11     int x=0,f=1;char ch=getchar();
    12     while(!isdigit(ch)){ch=getchar();}
    13     while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}
    14     return x;
    15 }
    16 struct data {
    17     int from,to,next,w;
    18 }e[maxm*2];
    19 int head[maxn],cnt;
    20 int cur[maxn];
    21 void add(int u,int v,int w){e[cnt].from=u;e[cnt].next=head[u];e[cnt].to=v;e[cnt].w=w;head[u]=cnt++;}
    22 int n,m,s,t;
    23 int q[maxn];
    24 bool vis[maxn];
    25 int dis[maxn];
    26 bool bfs() {
    27     memset(dis,-97,sizeof(dis));
    28     int h=0,tt=1;
    29     q[h]=t;
    30     vis[t]=1;
    31     dis[t]=0;
    32     while(h!=tt) {
    33         int now=q[h];h++;vis[now]=0;if(h==maxn) h=0;
    34         for(int i=head[now];i>=0;i=e[i].next) {
    35             int to=e[i].to;
    36             if(e[i^1].w&&dis[to]<-1000000) {
    37                 dis[to]=dis[now]-1;
    38                 if(!vis[to]){
    39                     vis[to]=1;
    40                     q[tt++]=to;if(tt==maxn) tt=0;
    41                 }
    42             }
    43         }
    44     }
    45     return dis[s]>=-1000000;
    46 }
    47 int dfs(int now,int a) {
    48     if(now==t||a==0) return a;
    49     int flow=0,f;
    50     for(int i=cur[now];i>=0;i=e[i].next) {
    51         int to=e[i].to;
    52         if(dis[to]==dis[now]+1&&e[i].w>0&&(f=dfs(to,min(a,e[i].w)))) {
    53             e[i].w-=f;
    54             e[i^1].w+=f;
    55             flow+=f;
    56             a-=f;
    57             if(a==0) return flow;
    58         }
    59         cur[now]=i;
    60     }
    61     if(!flow) dis[now]=-1;
    62     return flow;
    63 }
    64 int main() {
    65     memset(head,-1,sizeof(head));
    66     n=read(),m=read(),s=read(),t=read();
    67     for(int i=1;i<=m;i++) {
    68         int u=read(),v=read(),w=read();
    69         add(u,v,w);add(v,u,0);
    70     }
    71     int ans=0;
    72     while(bfs()){
    73         for(int i=1;i<=n;i++) cur[i]=head[i];
    74         ans+=dfs(s,2147483647);
    75     }
    76     printf("%d",ans);
    77 }
    View Code
    O(∩_∩)O~ (*^__^*) 嘻嘻…… O(∩_∩)O哈哈~
  • 相关阅读:
    一个小笔记(5):A*算法
    一个小笔记(4):递归下降分析法
    1.3 初步了解信号和槽
    一个小笔记(3):约瑟夫环
    1.2 第一个程序
    requestAnimationFrame
    javascript reg 不加入分组
    正则表达式匹配除单词外的任何字符
    自動化ツール(コード生成、パターン抽出)
    windows常用DLL及作用
  • 原文地址:https://www.cnblogs.com/wls001/p/7867503.html
Copyright © 2011-2022 走看看