zoukankan      html  css  js  c++  java
  • luogu P3376 【模板】网络最大流(no)ek

    题目描述

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

    输入输出格式

    输入格式:

    第一行包含四个正整数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。

     网络流 最大流 

    #include<queue>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    const int maxn=205;
    const int inf=0x7fffffff;
    
    int r[1000][1000]; 
    bool visit[1000];
    
    int pre[10000];
    int m,n;
    
    bool bfs(int s,int t) 
    {
        int p;
        queue<int > q;
        memset(pre,-1,sizeof(pre));
        memset(visit,false,sizeof(visit));
        pre[s]=s;
        visit[s]=true;
        q.push(s);
        while(!q.empty())
        {
            p=q.front();
            q.pop();
            for(int i=1;i<=n;i++)
            {
                if(r[p][i]>0&&!visit[i])
                {
                    pre[i]=p;
                    visit[i]=true;
                    if(i==t) return true;
                    q.push(i);
                }
            }
        }
        return false;
    }
    int EdmondsKarp(int s,int t)
    {
       int flow=0,d,i;
       while(bfs(s,t))
       {
           d=inf;
           for(i=t;i!=s;i=pre[i])
               d=d<r[pre[i]][i] ?  d : r[pre[i]][i];
           for(i=t;i!=s;i=pre[i])
           {
               r[pre[i]][i]-=d;
               r[i][pre[i]]+=d;
           }
           flow+=d;
       }
       return flow;
    }
    int s,t;
    int main()
    {
    	scanf("%d%d%d%d",&n,&m,&s,&t);
    	int u,v,w;
    	for(int i=1;i<=m;i++)
    	{
    		scanf("%d%d%d",&u,&v,&w);
    		r[u][v]+=w;	
    	}
    	printf("%d
    ",EdmondsKarp(s,t));
    	return 0;
    }
    

      

  • 相关阅读:
    C# 上传辅助方法
    C# 经纬度计算
    C#Excel导出反射数据集
    C# 数据模板导出
    C# 百度经纬度获取地址信息
    【平台开发】— 5.后端:代码分层
    【平台开发】— 4.mysql建库建表
    【平台开发】— 3.前端开发思路
    【平台开发】— 2.前端:vue-element-admin
    【平台开发】— 1.开篇
  • 原文地址:https://www.cnblogs.com/sssy/p/7157824.html
Copyright © 2011-2022 走看看