zoukankan      html  css  js  c++  java
  • 洛谷P3376 【模板】网络最大流

    题目描述

    如题,给出一个网络图,以及其源点和汇点,求出其网络最大流。

    输入输出格式

    输入格式:

    第一行包含四个正整数N、M、S、T,分别表示点的个数、有向边的个数、源点序号、汇点序号。

    接下来M行每行包含三个正整数ui、vi、wi,表示第i条有向边从ui出发,到达vi,边权为wi(即该边最大流量为wi)

    输出格式:

    一行,包含一个正整数,即为该网络的最大流。

    输入输出样例

    输入样例#1: 
    4 5 4 3
    4 2 30
    4 3 20
    2 3 20
    2 1 30
    1 3 40
    输出样例#1: 
    50

    说明

    时空限制:1000ms,128M

    数据规模:

    对于30%的数据:N<=10,M<=25

    对于70%的数据:N<=200,M<=1000

    对于100%的数据:N<=10000,M<=100000

    样例说明:

    题目中存在3条路径:

    4-->2-->3,该路线可通过20的流量

    4-->3,可通过20的流量

    4-->2-->1-->3,可通过10的流量(边4-->2之前已经耗费了20的流量)

    故流量总计20+20+10=50。输出50。

      1 #include<cstdio>
      2 #include<cstring>
      3 #include<iostream>
      4 using namespace std;
      5 const int maxn=1e4+10;
      6 const int maxm=1e5+10;
      7 int n,m,S,T,tot=1;
      8 int head[maxn],p[maxn],dis[maxn],q[maxn*2];
      9 bool vis[maxn];
     10 long long read()
     11 {
     12     long long x=0,f=1;
     13     char ch=getchar();
     14     while(ch>'9'||ch<'0')
     15     {
     16         if(ch=='-')
     17             f=-1;
     18         ch=getchar();
     19     }
     20     while(ch>='0'&&ch<='9')
     21     {
     22         x=x*10+ch-'0';
     23         ch=getchar();
     24     }
     25     return x*f;
     26 }
     27 struct node
     28 {
     29     int v,next,cap,flow;
     30 } e[maxm<<1];
     31 void add(int x,int y,int z)
     32 {
     33     e[++tot]=(node)
     34     {
     35         y,head[x],z,0
     36     };
     37     head[x]=tot;
     38     e[++tot]=(node)
     39     {
     40         x,head[y],0,0
     41     };
     42     head[y]=tot;
     43 }
     44 bool bfs()
     45 {
     46     int h=0,t=1;
     47     memset(dis,-1,sizeof(dis));
     48     dis[S]=0;
     49     q[1]=S;
     50     while(h!=t)
     51     {
     52         int x=q[++h];
     53         for(int i=head[x]; i; i=e[i].next)
     54         {
     55             int v=e[i].v;
     56             if(dis[v]==-1&&e[i].cap>e[i].flow)
     57             {
     58                 dis[v]=dis[x]+1;
     59                 q[++t]=v;
     60             }
     61         }
     62     }
     63     return dis[T]!=-1;
     64 }
     65 int dfs(int x,int f)
     66 {
     67     if(x==T||!f)
     68         return f;
     69     int used=0,f1;
     70     for(int &i=p[x]; i; i=e[i].next)
     71     {
     72         if(dis[x]+1==dis[e[i].v]&&(f1=dfs(e[i].v,min(f,e[i].cap-e[i].flow)))>0)
     73         {
     74             e[i].flow+=f1;
     75             e[i^1].flow-=f1;
     76             used+=f1;
     77             f-=f1;
     78             if(!f)
     79                 break;
     80         }
     81     }
     82     return used;
     83 }
     84 int dinic()
     85 {
     86     int ans=0;
     87     while(bfs())
     88     {
     89         for(int i=1; i<=n; i++)
     90             p[i]=head[i];
     91         ans+=dfs(S,0x7fffffff);
     92     }
     93     return ans;
     94 }
     95 int main()
     96 {
     97     n=read(),m=read(),S=read(),T=read();
     98     for(int i=1; i<=m; i++)
     99     {
    100         int x,y,z;
    101         x=read(),y=read(),z=read();
    102         add(x,y,z);
    103     }
    104     printf("%d",dinic());
    105     return 0;
    106 }
    View Code
  • 相关阅读:
    c#中ref与out区别
    【转载】Firebug中net面板的使用
    结构声明、定义
    开始旅程了
    strcpy、strcat、strcmp、strlen
    #include 格式
    宏定义
    MySQL 字段类型
    MySQL 约束类型
    (转载)C#语言之“string格式的日期时间字符串转为DateTime类型”的方法
  • 原文地址:https://www.cnblogs.com/liweilin/p/10198710.html
Copyright © 2011-2022 走看看