zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    Vim快捷键键位图大全
    Docker快速入门
    针对base64编码和URIEncode的一点研究
    JavaEE初学笔记之Servlet与Tomcat
    【编码】彻底弄懂ASCII、Unicode、UTF-8之间的关系
    React的世界观及与Vue之比较
    彻底搞懂CSS文本、空白换行问题
    Vue实现懒加载的基本思路
    CSS中的px与物理像素、逻辑像素、1px边框问题
    Vue插值文本换行问题
  • 原文地址:https://www.cnblogs.com/linkzijun/p/7287343.html
Copyright © 2011-2022 走看看