zoukankan      html  css  js  c++  java
  • Poj 1149 PIGS

    题解:有M个猪圈。有N个游客,每个游客想买一定数量的猪,并且有一些猪圈的钥匙。每一个顾客走之后,他打开的猪圈的猪可以分配到其它已打开的猪圈中。求最多能卖出多少猪。

    题解:参考博文:http://www.cnblogs.com/sleeper-qp/archive/2012/07/23/2605253.html

      1 #include <iostream>
      2 #include <cstring>
      3 #include <cstdio>
      4 #include <cstdlib>
      5 #include <cmath>
      6 #include <string>
      7 #include <vector>
      8 #include <list>
      9 #include <map>
     10 #include <queue>
     11 #include <stack>
     12 #include <bitset>
     13 #include <algorithm>
     14 #include <numeric>
     15 #include <functional>
     16 #include <set>
     17 #include <fstream>
     18 
     19 using namespace std;
     20 
     21 const int INF=0x3f3f3f3f;
     22 const int maxm=1010;
     23 const int maxn=110;
     24 
     25 int N,M;
     26 int customer[maxm][maxn];
     27 int cusnum[maxm];
     28 int pighouse[maxm];
     29 int B[maxn];
     30 struct edge{
     31     int u,v,cap,next;
     32 }G[maxn*maxm];
     33 int head[maxn*maxm],pre[maxn*maxm],level[maxn*maxm];
     34 int num[maxn*maxm],cur[maxn*maxm];
     35 int idx;
     36 int s,t,tt;
     37 
     38 void build(int u,int v,int cap)
     39 {
     40     G[idx].v=v;
     41     G[idx].cap=cap;
     42     G[idx].next=head[u];
     43     head[u]=idx++;
     44 }
     45 
     46 void add_edge(int u,int v,int cap)
     47 {
     48     build(u,v,cap);
     49     build(v,u,0);
     50 }
     51 
     52 void bfs()
     53 {
     54     memset(level,-1,sizeof(level));
     55     memset(num,0,sizeof(num));
     56     queue<int> q;
     57     q.push(t);
     58     level[t]=0;
     59     num[0]=1;
     60     while(!q.empty())
     61     {
     62         int u=q.front();
     63         q.pop();
     64         for(int i=head[u];i!=-1;i=G[i].next)
     65         {
     66             int v=G[i].v;
     67             if(level[v]==-1){
     68                 level[v]=level[u]+1;
     69                 num[level[v]]++;
     70                 q.push(v);
     71             }
     72         }
     73     }
     74 }
     75 
     76 void ISAP()
     77 {
     78     memcpy(cur,head,sizeof(cur));
     79     bfs();
     80     int flow=0;
     81     int u=pre[s]=s;
     82     while(level[s]<tt)
     83     {
     84         if(u==t){
     85             int f=INF,pos;
     86             for(int i=s;i!=t;i=G[cur[i]].v)
     87             {
     88                 if(f>G[cur[i]].cap){
     89                     f=G[cur[i]].cap;
     90                     pos=i;
     91                 }
     92             }
     93             for(int i=s;i!=t;i=G[cur[i]].v)
     94             {
     95                 G[cur[i]].cap-=f;
     96                 G[cur[i]^1].cap+=f;
     97             }
     98             flow+=f;
     99             u=pos;
    100         }
    101         int k;
    102         for(k=cur[u];k!=-1;k=G[k].next)
    103         {
    104             if(level[G[k].v]+1==level[u]&&G[k].cap) break;
    105         }
    106         if(k!=-1){
    107             cur[u]=k;
    108             pre[G[k].v]=u;
    109             u=G[k].v;
    110         }else{
    111             if(--num[level[u]]==0) break;
    112             int mind=tt;
    113             for(int i=head[u];i!=-1;i=G[i].next)
    114             {
    115                 if(mind>level[G[i].v]&&G[i].cap){
    116                     mind=level[G[i].v];
    117                     cur[u]=i;
    118                 }
    119             }
    120             level[u]=mind+1;
    121             num[level[u]]++;
    122             u=pre[u];
    123         }
    124     }
    125     printf("%d
    ",flow);
    126 }
    127 
    128 void init()
    129 {
    130     memset(cusnum,0,sizeof(cusnum));
    131     memset(head,-1,sizeof(head));
    132     //    memset(timec,0,sizeof(timec));
    133     s=0;
    134     t=N+1;
    135     tt=t+1;
    136     idx=0;
    137 }
    138 
    139 void build_graph()
    140 {
    141     for(int i=1;i<=N;i++)
    142     {
    143         add_edge(i,t,B[i]);
    144     }
    145     for(int i=1;i<=M;i++)
    146     {
    147         if(cusnum[i]>0){
    148             add_edge(s,customer[i][0],pighouse[i]);
    149         }
    150         for(int j=1;j<cusnum[i];j++)
    151         {
    152             add_edge(customer[i][j-1],customer[i][j],INF);
    153         }
    154     }
    155 }
    156 
    157 int main()
    158 {
    159 //    freopen("/Users/apple/Desktop/暑假/POJ 1149 PIGS/POJ 1149 PIGS/in","r",stdin);
    160     while(scanf("%d%d",&M,&N)!=EOF)
    161     {
    162         init();
    163         for(int i=1;i<=M;i++)
    164         {
    165             scanf("%d",&pighouse[i]);
    166         }
    167         for(int i=1;i<=N;i++)
    168         {
    169             int A,key;
    170             scanf("%d",&A);
    171             for(int j=1;j<=A;j++)
    172             {
    173                 scanf("%d",&key);
    174                 customer[key][cusnum[key]++]=i;
    175             }
    176             scanf("%d",&B[i]);
    177         }
    178         // puts("YES");
    179         build_graph();
    180         // puts("YES");
    181         ISAP();
    182         // puts("YES");
    183     }
    184     return 0;
    185 }
  • 相关阅读:
    中阶 d04.1 xml解析
    中阶 d04 xml 概念及使用
    中阶 d03.5 (正篇)完整的Dao 操作数据库
    中阶d03.4 JDBC_DAO
    中阶d03.3 JDBC_CURD_Util --- 使用 junit执行单元测试(增删改查)
    单元测试 junit
    idle中上传jar包并使用的方法
    intelij idea 和 eclipse 使用上的区别
    中阶d03.2 JDBC联合properties使用,通过读取本地配置文件为代码传递参数
    swift init 初始化
  • 原文地址:https://www.cnblogs.com/der-z/p/3920088.html
Copyright © 2011-2022 走看看