• 网络流模板(Dinic)


     1 #include<iostream>
     2 #include<algorithm>
     3 #include<cstdio>
     4 #include<cstring>
     5 #include<cmath>
     6 #include<cstdlib>
     7 #include<vector>
     8 using namespace std;
     9 typedef long long ll;
    10 typedef long double ld;
    11 typedef pair<int,int> pr;
    12 const double pi=acos(-1);
    13 #define rep(i,a,n) for(int i=a;i<=n;i++)
    14 #define per(i,n,a) for(int i=n;i>=a;i--)
    15 #define Rep(i,u) for(int i=head[u];i;i=Next[i])
    16 #define clr(a) memset(a,0,sizeof(a))
    17 #define pb push_back
    18 #define mp make_pair
    19 #define fi first
    20 #define sc second
    21 #define pq priority_queue
    22 #define pqb priority_queue <int, vector<int>, less<int> >
    23 #define pqs priority_queue <int, vector<int>, greater<int> >
    24 #define vec vector
    25 ld eps=1e-9;
    26 ll pp=1000000007;
    27 ll mo(ll a,ll pp){if(a>=0 && a<pp)return a;a%=pp;if(a<0)a+=pp;return a;}
    28 ll powmod(ll a,ll b,ll pp){ll ans=1;for(;b;b>>=1,a=mo(a*a,pp))if(b&1)ans=mo(ans*a,pp);return ans;}
    29 void fre() { freopen("c://test//input.in", "r", stdin); freopen("c://test//output.out", "w", stdout); }
    30 //void add(int x,int y,int z){ v[++e]=y; next[e]=head[x]; head[x]=e; cost[e]=z; }
    31 int dx[5]={0,-1,1,0,0},dy[5]={0,0,0,-1,1};
    32 ll read(){ ll ans=0; char last=' ',ch=getchar();
    33 while(ch<'0' || ch>'9')last=ch,ch=getchar();
    34 while(ch>='0' && ch<='9')ans=ans*10+ch-'0',ch=getchar();
    35 if(last=='-')ans=-ans; return ans;
    36 }
    37 #define M 1000
    38 #define N 1000
    39 const int INF=1<<30;
    40 int head[N],level[N],q[N],e,n,m;
    41 struct E_node{
    42     int v,f,Next;
    43 }edge[M];
    44 void add(int x,int y,int z){
    45     edge[++e].v=y; edge[e].f=z; edge[e].Next=head[x]; head[x]=e;
    46     edge[++e].v=x; edge[e].f=0; edge[e].Next=head[y]; head[y]=e;
    47 }
    48 int bfs(int s,int t){
    49     memset(level,0,sizeof(level));
    50     level[s]=1;
    51     int h=0,t_=1; q[h]=s;
    52     while (h<t_){
    53         int x=q[h++];
    54         if (x==t) return 1;
    55         for (int i=head[x];i;i=edge[i].Next){
    56             int v=edge[i].v,f=edge[i].f;
    57             if (!level[v] && f>0){
    58                 level[v]=level[x]+1;
    59                 q[t_++]=v;
    60             }
    61         }
    62     }
    63     return 0;
    64 }
    65 int dfs(int u,int maxf,int t){
    66     if (u==t) return maxf;
    67     int ret=0;
    68     for (int i=head[u];i;i=edge[i].Next){
    69         int v=edge[i].v,f=edge[i].f;
    70         if (level[v]==level[u]+1 && f>0){
    71             int Min=min(maxf-ret,f);
    72             f=dfs(v,Min,t);
    73             edge[i].f-=f;
    74             edge[i^1].f+=f;
    75             ret+=f;
    76             if (ret==maxf) return ret;
    77         }
    78     }
    79     return ret; 
    80 }
    81 int Dinic(int s,int t){
    82     int ans=0;
    83     while (bfs(s,t)) ans+=dfs(s,INF,t);
    84     return ans;
    85 }
    86 int main(){
    87     n=read(),m=read();
    88     for (int i=1;i<=n;i++){
    89         int x=read(),y=read(),c=read();
    90         add(x,y,c);
    91     }
    92     printf("%d
    ",Dinic(1,m));
    93     return 0;
    94 } 
  • 相关阅读:
    POJ 1469 COURSES 二分图最大匹配
    POJ 1325 Machine Schedule 二分图最大匹配
    USACO Humble Numbers DP?
    SGU 194 Reactor Cooling 带容量上下限制的网络流
    POJ 3084 Panic Room 求最小割
    ZOJ 2587 Unique Attack 判断最小割是否唯一
    Poj 1815 Friendship 枚举+求最小割
    POJ 3308 Paratroopers 最小点权覆盖 求最小割
    1227. Rally Championship
    Etaoin Shrdlu
  • 原文地址:https://www.cnblogs.com/SXia/p/7208470.html
Copyright © 2020-2023  润新知