• Dinic算法学习&&HDU2063


    http://www.cnblogs.com/SYCstudio/p/7260613.html

    看这篇博文懂了一点,做题再体会体会吧

    找了好久都没找到一个好用的模板……

    我也是佛了。。最后决定用峰神的板子!

    贴一个题解,HDU2063

      1 #include <algorithm>
      2 #include <iostream>
      3 #include <iomanip>
      4 #include <cstring>
      5 #include <climits>
      6 #include <complex>
      7 #include <fstream>
      8 #include <cassert>
      9 #include <cstdio>
     10 #include <bitset>
     11 #include <vector>
     12 #include <deque>
     13 #include <queue>
     14 #include <stack>
     15 #include <ctime>
     16 #include <set>
     17 #include <map>
     18 #include <cmath>
     19 using namespace std;
     20 typedef struct Edge {
     21     int u, v, c, next;
     22 }Edge;
     23 const int inf = 0x7f7f7f7f;
     24 const int maxn = 10000;
     25 #define maxm 30000
     26 #define ll long long
     27 #define mem(a,b) memset(a,b,sizeof a)
     28 inline int read()
     29 {
     30     int x=0,f=1;
     31     char ch=getchar();
     32     while(ch<'0'||ch>'9')
     33     {
     34         if(ch=='-') f=-1;
     35         ch=getchar();
     36     }
     37     while(ch>='0'&&ch<='9')
     38     {
     39         x=10*x+ch-'0';
     40         ch=getchar();
     41     }
     42     return x*f;
     43 }
     44 int  n,m,s,t,maxflow,tot=1,head[maxn],cur[maxn],h[maxn],q[maxn];
     45 struct edge{int go,next,v;}e[maxm];
     46 void ins(int x,int y,int z){e[++tot].go=y;e[tot].v=z;e[tot].next=head[x];head[x]=tot;}
     47 void insert(int x,int y,int z){ins(x,y,z);ins(y,x,0);}
     48 bool bfs()
     49 {
     50     mem(h,-1);
     51     int l=0,r=1;q[1]=s;h[s]=0;
     52     while(l<r)
     53     {
     54         int x=q[++l];
     55         for(int i=head[x];i;i=e[i].next)
     56          if(e[i].v&&h[e[i].go]==-1)
     57          {
     58             h[e[i].go]=h[x]+1;q[++r]=e[i].go;
     59          }
     60     }
     61     return h[t]!=-1;
     62 }
     63 int dfs(int x,int f)
     64 {
     65     if(x==t) return f;
     66     int tmp,used=0;
     67     for(int i=head[x];i;i=e[i].next)
     68      if(e[i].v&&h[e[i].go]==h[x]+1)
     69     {
     70         tmp=dfs(e[i].go,min(e[i].v,f-used));
     71         e[i].v-=tmp;if(e[i].v)cur[x]=i;
     72         e[i^1].v+=tmp;used+=tmp;
     73         if(used==f)return f;       
     74     }
     75     if(!used) h[x]=-1;
     76     return used;
     77 }
     78 void dinic()
     79 {
     80     maxflow=0;
     81     while(bfs())
     82     {
     83         for (int i=s;i<=t;i++)cur[i]=head[i];maxflow+=dfs(s,inf);
     84     }
     85 }
     86 void init()
     87 {
     88    mem(head,0);
     89    mem(h,-1);
     90 }
     91 int main() {
     92     int k;
     93     while(~scanf("%d",&k)&&k){
     94     init();
     95     m=read();n=read();
     96     //源点到每个女生,每个男生到终点。
     97     int src=0,des=m+m+n+1;
     98     for(int i=1;i<=m;++i)
     99      insert(src,i,1);
    100     for(int i=1;i<=n;++i)
    101     insert(m+i,des,1);
    102     for(int i=1;i<=k;++i)
    103     {
    104         int a=read(),b=read();
    105         insert(a,b+m,1);
    106     }
    107     s=0;t=des;
    108     dinic();
    109     cout<<maxflow<<endl;
    110     }
    111     return 0;
    112 }
  • 相关阅读:
    Java map双括号初始化方式的问题
    Koa 中间件的执行
    JavaScript 实现页面中录音功能
    Koa 中实现 chunked 数据传输
    WebAssembly 上手
    TypeScript `infer` 关键字
    Vim 插件的安装
    MySQL EXPLAIN 语句
    面向切面编程(AOP)
    CSS 类名的问题
  • 原文地址:https://www.cnblogs.com/TYH-TYH/p/9433735.html
Copyright © 2020-2023  润新知