题意:每台电脑共有p种零件,现在有n台机器,给出n台机器每台需要的一些种类零件当原料(0代表不需要,1代表必须要,2代表可有可无)和输出的产品零件。问怎么安排生产线使生产出来零件可以组装的电脑最多。
思路:如果机器的原材料什么都不需要的话就可以当源点,如果机器输出的零件种类为p就可以当汇点。刚开始想复杂了(1 0 1 可以同时跟1 0 0和0 0 1相连),这题只有当一台机器的输出格式跟另一台的输入格式一样时才可以相连,不能有多余的零件产生。最后想想如果不是这样的话,2代表的可有可无就没意义了。当p=3时,输出1 0 1不能跟1 0 0相连但可以跟1 0 2相连。
#include#include const int N=100;const int inf=0x3fffffff;int gap[N],dis[N],head[N],num,start,end,ans,pp[N*N];struct edge{ int st,ed,flow,next;}e[N*N],ee[N*N];void addedge(int x,int y,int w){ ee[num].st=x;ee[num].ed=y;ee[num].flow=w; e[num].st=x;e[num].ed=y;e[num].flow=w;e[num].next=head[x];head[x]=num++; e[num].st=y;e[num].ed=x;e[num].flow=0;e[num].next=head[y];head[y]=num++;}struct node{ int in[11],out[11],w;}p[N];int dfs(int u,int minflow){ if(u==end)return minflow; int i,flow=0,f,v,min_dis=ans-1; for(i=head[u];i!=-1;i=e[i].next) { if(e[i].flow<=0)continue; v=e[i].ed; if(dis[v]+1==dis[u]) { f=dfs(v,e[i].flow>minflow-flow?minflow-flow:e[i].flow); e[i].flow-=f; e[i^1].flow+=f; flow+=f; if(flow==minflow)break; if(dis[start]>=ans)return flow; } min_dis=min_dis>dis[v]?dis[v]:min_dis; } if(flow==0) { if(--gap[dis[u]]==0) dis[start]=ans; dis[u]=min_dis+1; gap[dis[u]]++; } return flow;}int isap(){ int maxflow=0; memset(dis,0,sizeof(dis)); memset(gap,0,sizeof(gap)); gap[0]=ans; while(dis[start]