POJ 3436 ACM Computer Factory
  QLtA9LK6PyNk 2023年11月02日 47 0


简单最大流,拆点做。模板敲错WA了好几次

#include<cstdio>
#include<cstring>
#define inf 1000000
#define min(a,b) ((a)>(b))?(b):(a)
using namespace std;
int num[60],in[60][11],out[60][11];
int n,k,dist[200],gap[200],edgeHead[200];//双向边
struct{
    int u,v,cap,beg,next,re;
}edge[3000];

void addEdge(int u,int v,int ca){
	edge[k].u=u;
    edge[k].v=v;
    edge[k].beg=ca;
    edge[k].cap=ca;
    edge[k].next=edgeHead[u];
    edge[k].re=k + 1;               //这个用来记录此边的反边
    edgeHead[u]=k ++;
    edge[k].u=v;
    edge[k].v=u;
    edge[k].beg=0;
    edge[k].cap=0;
    edge[k].next=edgeHead[v];
    edge[k].re=k - 1;
    edgeHead[v]=k ++;
}
int dfs (int p , int limit)
{
    if(p==n)return limit;

    for(int i=edgeHead[p];i!=0;i=edge[i].next){
        int v = edge[i].v;
        if(dist[p]==(dist[v]+1) && edge[i].cap>0){
            int t=dfs(v,min(limit , edge[i].cap));
            if(t<0)return t;//没有增广路了
            if(t>0)//更新流
            {
                edge[i].cap-=t;
                edge[edge[i].re].cap+=t;
                return t;
            }
        }
    }

    int tmp=n+1;
    for(int i=edgeHead[p];i!=0;i=edge[i].next){
        int v = edge[i].v;
        if(edge[i].cap>0)
            tmp=min(tmp,dist[v]+1);
    }

    if(--gap[dist[p]]==0 || dist[0]>n)return -1;//出现断层或回流已满
    ++gap[dist[p]=tmp];
    return 0;
}

int SAP()
{
    gap[0]=n+1;
    int f = 0 , t=0;
    while (~(t=dfs(0,inf))) f+=t;
    return f;
}
int main(){
	int p,node,i,j,q;
	int ans[3000][4];
	scanf("%d %d",&p,&node);
	k=1;
	memset(edgeHead,0,sizeof(edgeHead));
	for(i=1;i<=node;i++){
		scanf("%d",&num[i]);
		for(j=1;j<=p;j++)
			scanf("%d",&in[i][j]);
		for(j=1;j<=p;j++)
			scanf("%d",&out[i][j]);
	}
	for(i=1;i<=node;i++){
		bool flag=0;
		for(j=1;j<=p;j++){
			if(in[i][j]==1){
				flag=1;
				break;
			}
		}
		if(!flag)
			addEdge(0,i,num[i]);
			
		flag=0;
		for(j=1;j<=p;j++){
			if(out[i][j]==0){
				flag=1;
				break;
			}
		}
		if(!flag)
			addEdge(i+node,2*node+1,num[i]);
	
		addEdge(i,i+node,num[i]);
		for(j=1;j<=node;j++)
			if(i!=j){
				flag=0;
				for(q=1;q<=p;q++){
					if(!(in[j][q]==2 || (in[j][q]==1 && out[i][q]==1) || (in[j][q]==0 && out[i][q]==0))){
						flag=1;
						break;
					}
				}
				if(!flag)
					addEdge(i+node,j,inf);
					
			}
	}
	memset(dist,0,sizeof(dist));
	memset (gap , 0 , sizeof(gap));
	n=2*node+1;
	int sum=SAP();
	int cou=0;
	for(i=0;i<k;i++){
		if(edge[i].u==0 || edge[i].u==n || edge[i].v==0 || edge[i].v==n)
			continue;
		if(edge[i].u-edge[i].v==node || edge[i].u-edge[i].v==-node)
			continue;
		if(edge[i].beg==0)
			continue;
		if(edge[i].beg<=edge[i].cap)
			continue;
		ans[cou][1]=edge[i].u>node?edge[i].u-node:edge[i].u;
		ans[cou][2]=edge[i].v>node?edge[i].v-node:edge[i].v;
		ans[cou++][3]=edge[i].beg-edge[i].cap;
	}
	printf("%d %d\n",sum,cou);
	for(i=0;i<cou;i++)
		printf("%d %d %d\n",ans[i][1],ans[i][2],ans[i][3]);
	return 0;
}

 

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
QLtA9LK6PyNk
作者其他文章 更多

2023-11-02

2023-11-02

2023-11-02

2023-11-02

2023-11-02

2023-11-02

2023-11-02

2023-11-02