zoukankan      html  css  js  c++  java
  • Loj #6000. 「网络流 24 题」搭配飞行员

    题目链接:https://loj.ac/problem/6000

    先来贴一发模板,然后去刷题

      1 #include <bits/stdc++.h>
      2 using namespace std;
      3 
      4 const int MAXN=1005;
      5 const int MAXM=3005;
      6 const int INF=0x3f3f3f3f;
      7 struct Edge
      8 {
      9     int to,next,cap,flow;
     10 }edge[MAXM];
     11 int tol,head[MAXN];
     12 int gap[MAXN],dep[MAXN],pre[MAXN],cur[MAXN];
     13 void init()
     14 {
     15     tol=0;
     16     memset(head,-1,sizeof(head));
     17 }
     18 void addedge(int u,int v,int w,int rw=0)
     19 {
     20     edge[tol].to=v;
     21     edge[tol].cap=w;
     22     edge[tol].next=head[u];
     23     edge[tol].flow=0;
     24     head[u]=tol++;
     25     edge[tol].to=u;
     26     edge[tol].cap=rw;
     27     edge[tol].next=head[v];
     28     edge[tol].flow=0;
     29     head[v]=tol++;
     30 }
     31 int sap(int st,int ed,int N)
     32 {
     33     memset(gap,0,sizeof(gap));
     34     memset(dep,0,sizeof(dep));
     35     memcpy(cur,head,sizeof(head));
     36     int u=st;
     37     pre[u]=-1;
     38     gap[0]=N;
     39     int ans=0;
     40     while(dep[st]<N)
     41     {
     42         if(u==ed)
     43         {
     44             int Min=INF;
     45             for(int i=pre[u];i!=-1;i=pre[edge[i^1].to])
     46                 if(Min>edge[i].cap-edge[i].flow)
     47                     Min=edge[i].cap-edge[i].flow;
     48             for(int i=pre[u];i!=-1;i=pre[edge[i^1].to])
     49             {
     50                 edge[i].flow+=Min;
     51                 edge[i^1].flow-=Min;
     52             }
     53             u=st;
     54             ans+=Min;
     55             continue;
     56         }
     57         bool flag=0;
     58         int v;
     59         for(int i=cur[u];i!=-1;i=edge[i].next)
     60         {
     61             v=edge[i].to;
     62             if(edge[i].cap-edge[i].flow && dep[v]+1==dep[u])
     63             {
     64                 flag=1;
     65                 cur[u]=pre[v]=i;
     66                 break;
     67             }
     68         }
     69         if(flag)
     70         {
     71             u=v;
     72             continue;
     73         }
     74         int Min=N;
     75         for(int i=head[u];i!=-1;i=edge[i].next)
     76             if(edge[i].cap-edge[i].flow && dep[edge[i].to]<Min)
     77             {
     78                 Min=dep[edge[i].to];
     79                 cur[u]=i;
     80             }
     81         gap[dep[u]]--;
     82         if(!gap[dep[u]])return ans;
     83         dep[u]=Min+1;
     84         gap[dep[u]]++;
     85         if(u!=st)u=edge[pre[u]^1].to;
     86     }
     87     return ans;
     88 }
     89 int main()
     90 {
     91     ios_base::sync_with_stdio(false);
     92     cin.tie(0);
     93     int n,m;
     94     init();
     95     cin>>n>>m;
     96     int a,b;
     97     for(int i=1;i<=m;i++){
     98         addedge(0,i,1);
     99     }
    100     for(int i=m+1;i<=n;i++){
    101         addedge(i,n+1,1);
    102     }
    103     while(cin>>a>>b){
    104         addedge(a,b,1);
    105     }
    106     int d=sap(0,n+1,n+2);
    107     cout<<d<<endl;
    108     return 0;
    109 }
    View Code
  • 相关阅读:
    报表容器元素的典型用途:保持位置关系+表角斜线
    如何在Wyn仪表板中实现文件下载
    报表表格中的迷你图
    怎么实现固定行数的表格类报表
    如何把自己设计好的仪表板分享给别人?
    报表中的【子弹图】实现方法
    来自不同数据集的图表如何设置联动
    仪表板图表条件格式化设置
    报表中的数据格式设置方法汇总
    仪表板数据表根据用户需求可以自由选择查看的数据列
  • 原文地址:https://www.cnblogs.com/ls961006/p/9037010.html
Copyright © 2011-2022 走看看