zoukankan      html  css  js  c++  java
  • POJ 1149 PIGS | 最大流问题

    参考了这个PDF

    第一道网络流啊!感动

     1 #include<cstdio>
     2 #include<algorithm>
     3 #include<cstring>
     4 #include<vector>
     5 #include<queue>
     6 #define INF 100000000
     7 #define N 500
     8 #define M 1100
     9 using namespace std;
    10 struct adj
    11 {
    12     int u,v,w;
    13 }e[M*M];
    14 int head[N],n,m,S,T,a[M],k,ecnt=1,x,flw[N],tmp,lev[N],ans,last[M];
    15 vector <int> buy[M];
    16 queue <int> q;
    17 void add(int u,int v,int w)
    18 {
    19     e[++ecnt].v=v;
    20     e[ecnt].w=w;
    21     e[ecnt].u=head[u];
    22     head[u]=ecnt;
    23 }
    24 int bfs()
    25 {
    26     memset(lev,-1,sizeof(lev));
    27     lev[S]=0;
    28     q.push(S);
    29     while (!q.empty())
    30     {
    31         int x=q.front();
    32         for (int i=head[x];i;i=e[i].u)
    33         {
    34              int v=e[i].v;
    35              if (lev[v]==-1 && e[i].w>0)
    36          lev[v]=lev[x]+1,q.push(v);
    37         }
    38         q.pop();
    39     }
    40     return lev[T]!=-1;
    41 }
    42 int dfs(int x,int flw)
    43 {
    44     if (x==T) return flw;
    45     for (int i=head[x];i;i=e[i].u)
    46     {
    47     int v=e[i].v,tmp;
    48         if (lev[v]==lev[x]+1 && e[i].w>0 && (tmp=dfs(v,min(flw,e[i].w)))>0)
    49         {
    50             e[i].w-=tmp;
    51             e[i^1].w+=tmp;
    52             return tmp;
    53         }
    54     }
    55     return 0;
    56 }
    57 int main()
    58 {
    59     scanf("%d%d",&m,&n);
    60     S=n+1,T=n+2;
    61     for (int i=1;i<=m;i++)
    62     scanf("%d",&a[i]);
    63     for (int i=1;i<=n;i++)
    64     {
    65     scanf("%d",&k);
    66     for (int j=1;j<=k;j++)
    67     {
    68         scanf("%d",&x);
    69         buy[i].push_back(x);
    70     }
    71     scanf("%d",&x);
    72     add(i,T,x),add(T,i,0);
    73     }
    74     for (int i=1;i<=n;i++)
    75     for (int j=0;j<buy[i].size();j++)
    76     {
    77         int v=buy[i][j];
    78         if (!last[v])
    79         last[v]=i,add(S,i,a[v]),add(i,S,0);
    80         else
    81         add(last[v],i,INF),add(i,last[v],0),last[v]=i;
    82     }
    83     while (bfs())
    84     while ((tmp=dfs(S,INF))>0) ans+=tmp;
    85     printf("%d",ans);
    86     return 0;
    87 }
  • 相关阅读:
    按键精灵-3-按键精灵键盘鼠标命令
    Python-13-pass,del和exec
    STP-9-处理RSTP中的拓扑变化
    Python-12-简单推导
    Python-11-循环
    Python-10-条件和条件语句
    Qt qml listview 列表视图控件(下拉刷新、上拉分页、滚动轴)
    Qt qml pageview 左右滑动分页组件
    Qt qml treeview 树控件
    Qt qml 模拟iphone slide to unlock 的聚光动画文字效果
  • 原文地址:https://www.cnblogs.com/mrsheep/p/7929866.html
Copyright © 2011-2022 走看看