• POJ1273 最大流模板


    之前自己写的,以后当一个模板的基础吧,不管是最大流,最小割,二分图匹配

    下面是POJ1273的一个裸题..

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <vector>
     5 #include <queue>
     6 using namespace std;
     7 struct node{
     8     int to,cap,rev;
     9     node(int _to,int _cap,int _rev):to(_to),cap(_cap),rev(_rev){}
    10 };
    11 const int maxn=1005;
    12 vector<node> G[maxn];
    13 int s,t;
    14 void add(int u,int v,int cap){
    15     G[u].push_back(node(v,cap,G[v].size()));
    16     G[v].push_back(node(u,0,G[u].size()-1));
    17 }
    18 bool vis[maxn];//这个可以不要,level数组可以起两个作用,记录层数和是否被访问过,类似于dp数组
    19 int level[maxn],iter[maxn];
    20 void bfs(){
    21     memset(level,-1,sizeof(level));
    22     queue<int> q;
    23     q.push(s);int i;level[s]=0;
    24     while(!q.empty()){
    25         int u=q.front();
    26         q.pop();
    27         for(i=0;i<G[u].size();++i){
    28             node& e=G[u][i];
    29             if(e.cap>0&&level[e.to]<0){
    30                 level[e.to]=level[u]+1;
    31                 q.push(e.to);                
    32             }
    33         }
    34     }
    35     //需要得到所有顶点的level信息,一方面起vis的作用,另一方面起到转移的作用
    36     //而且考虑到可能同时存在多个最短增广路
    37 }
    38 int dfs(int v,int t,int f){
    39     //printf("v:%d t:%d f:%d
    ",v,t,f);
    40     if(v==t) return f;
    41     for(int &i=iter[v];i<G[v].size();++i){
    42         node &e=G[v][i];
    43         if(e.cap>0&&level[e.to]>level[v]){
    44             int d=dfs(e.to,t,min(e.cap,f));
    45             if(d>0){
    46                 e.cap-=d;
    47                 G[e.to][e.rev].cap+=d;
    48                 return d;
    49             }
    50         }        
    51     }
    52     return 0;//这里忘记return 0了...
    53 }
    54 const int INF=~0u>>1;
    55 int maxflow(){
    56     int flow=0,f;
    57     for(;;){
    58         bfs();
    59         if(level[t]<0) return flow;
    60         memset(iter,0,sizeof(iter));
    61         while((f=dfs(s,t,INF))>0) flow+=f; 
    62     }
    63 }
    64 //直觉上 容量种数越少越快
    65 int main(){
    66     //freopen("testMaxFlow.txt","r",stdin);
    67     int n,i,u,v,cap,m;
    68     while(~scanf("%d%d",&m,&n)){
    69         s=1;t=n;
    70         for(int i=1;i<=n;++i) G[i].clear();//多组数据要清空边
    71         for(i=0;i<m;++i){
    72             scanf("%d%d%d",&u,&v,&cap);
    73             add(u,v,cap);
    74         }
    75         printf("%d
    ",maxflow());
    76     }
    77     return 0;
    78 }
  • 相关阅读:
    在CentOS 7.6上安装VNC Server
    CentOS7.6 安装Docker
    CentOS 7.6 安装 Weblogic 12
    CentOS 7.6 安装Oracle 12c
    Spring MVC 使用介绍(五)—— 注解式控制器(一):基本介绍
    Spring MVC 使用介绍(四)—— 拦截器
    Spring MVC 使用介绍(三)—— Controller接口控制器
    Spring MVC 使用介绍(二)—— DispatcherServlet
    Spring MVC 使用介绍(一)—— 概述
    Spring 使用介绍(十三)—— Bean的生命周期
  • 原文地址:https://www.cnblogs.com/linkzijun/p/7287343.html
Copyright © 2020-2023  润新知