现在的位置: 首页 > 综合 > 正文

pku 1149 PIGS(最大流)

2014年02月23日 ⁄ 综合 ⁄ 共 2070字 ⁄ 字号 评论关闭
    这题的网络是这样建的。设一个源点s,s将于客户节点相连,连接方式为对考虑一个猪圈是第一次被光顾s将于这位顾客之间
有一条流容量是该猪圈的猪数,若这个猪圈被人光顾过,则在这个顾客和前一个顾客间有一条无限流量的通道。依次下去完成顾客
节点和s,顾客节点和顾客阶段间的网络。最后是顾客和汇点的网络,每个顾客和汇点t都有条通道,容量是顾客希望购买的数量。      

  1. /*pku1149
  2.   Name: PIGS
  3.   Date: 27-07-08 16:42
  4.   Description: 最大流 
  5. */
  6. #include<stdio.h>
  7. #include<algorithm>
  8. #define pr printf
  9. #define MAX 10000000
  10. int pig[1002][103];
  11. int a[103][103],max;//容量
  12. int b[103][103];
  13. int m,n,min;
  14. #define SIZE 1000
  15. #define MAXN 103
  16. #define inf 1000000000
  17. int max_flow(int n,int mat[][MAXN],int source,int sink,int flow[][MAXN]){
  18.     int pre[MAXN],que[MAXN],d[MAXN],p,q,t,i,j;
  19.     if (source==sink) return inf;
  20.     for (i=0;i<n;i++)
  21.         for (j=0;j<n;flow[i][j++]=0);
  22.     for (;;){
  23.         for (i=0;i<n;pre[i++]=0);
  24.         pre[t=source]=source+1,d[t]=inf;
  25.         for (p=q=0;p<=q&&!pre[sink];t=que[p++])
  26.             for (i=0;i<n;i++)
  27.                 if (!pre[i]&& (j=mat[t][i]-flow[t][i]))
  28.                     pre[que[q++]=i]=t+1,d[i]=d[t]<j?d[t]:j;
  29.                 else if (!pre[i]&& (j=flow[i][t]))
  30.                     pre[que[q++]=i]=-t-1,d[i]=d[t]<j?d[t]:j;
  31.         if (!pre[sink]) break;
  32.         for (i=sink;i!=source;)
  33.             if (pre[i]>0)
  34.                 flow[pre[i]-1][i]+=d[sink],i=pre[i]-1;
  35.             else
  36.                 flow[i][-pre[i]-1]-=d[sink],i=-pre[i]-1;
  37.     }
  38.     for (j=i=0;i<n;j+=flow[source][i++]);
  39.     return j;
  40. }
  41. int main(){
  42.     int i,j,A,B,key;
  43.     scanf("%d%d",&m,&n);
  44.     memset(a,inf,sizeof(a));//0表示没有流量 
  45.     for(i=1;i<=m;i++)
  46.         {
  47.             scanf("%d",&pig[i][0]);
  48.             pig[i][102]=0;
  49.         }
  50.     for(i=1;i<=n;i++)
  51.         {
  52.             scanf("%d",&A);
  53.             for(j=1;j<=A;j++)
  54.                 {
  55.                     scanf("%d",&key);
  56.                     if(pig[key][102]==0){a[0][i]+=pig[key][0];}//猪圈只和第一个顾客相连 
  57.                     for(int k=pig[key][102];k>=1;k--){
  58.                             a[pig[key][k]][i]=MAX;
  59.                         }
  60.                     pig[key][++pig[key][102]]=i;
  61.                 }                    
  62.              scanf("%d",&B);
  63.              a[i][n+1]=B;
  64.         }
  65.            max=max_flow(n+2,a,0,n+1,b);//0是源点,n+1是汇点
  66.         pr("%d/n",max);
  67. }

 

抱歉!评论已关闭.