P2762 网络流WA0pts 求调
  • 板块学术版
  • 楼主Polaris_flame
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/8/14 19:47
  • 上次更新2023/11/3 03:47:49
查看原帖
P2762 网络流WA0pts 求调
1046448
Polaris_flame楼主2023/8/14 19:47

题目link

#include<bits/stdc++.h>
#define FL(i,a,b) for(int i=(a);i<=(b);i++)
#define FR(i,a,b) for(int i=(a);i>=(b);i--)
#define ll long long
using namespace std;
const int MAXN = 1e2 + 10;
const int MAXM = 6e3 + 10;
const int inf = 0x3f3f3f3f;
int head[MAXN],d[MAXN];
int n,m,s,t,cnt,x,maxflow,flow,sum;
struct node{
	int nxt,v,w;
}e[MAXM<<1];
void add(int u,int v,int w){
	e[++cnt].v=v;
	e[cnt].w=w;
	e[cnt].nxt=head[u];
	head[u]=cnt;
	e[++cnt].v=u;
	e[cnt].w=0;
	e[cnt].nxt=head[v];
	head[v]=cnt;
}
bool bfs(){
	memset(d,0,sizeof(d));
	d[s]=1;
	queue<int>q;
	q.push(s);
	while(!q.empty()){
		int u=q.front();
		q.pop();
		for(int i=head[u];i;i=e[i].nxt){
			if(e[i].w&&!d[e[i].v]){
				d[e[i].v]=d[u]+1;
				if(e[i].v==t) return 1;
				q.push(e[i].v);
			}
		}
	}
	return 0;
}
int dinic(int x,int flow){
	if(x==t) return flow;
	int rest=flow,k;
	for(int i=head[x];i;i=e[i].nxt){
		if(e[i].w&&d[e[i].v]==d[x]+1){
			k=dinic(e[i].v,min(rest,e[i].w));
			if(!k) d[e[i].v]=0;
			e[i].w-=k;
			e[i^1].w+=k;
			rest-=k;
		}
	}
	return flow-rest;
}
int main(){
	scanf("%d%d",&m,&n);
	s=n+m+1,t=s+1,cnt=1;
	FL(i,1,m){ 
		scanf("%d",&x);
		add(s,i,x);
		sum+=x;
		while(~scanf("%d",&x)) add(i,m+x,inf);
	}
	FL(i,1,n){
		scanf("%d",&x);
		add(m+i,t,x);
	}
	while(bfs()){
		while(flow=dinic(s,inf)){
			maxflow+=flow;
		}
	}
	FL(i,1,m){
		if(d[i]) printf("%d ",i); 
	}
	printf("\n");
	FL(i,1,n){
		if(d[i+m]) printf("%d ",i);
	}
	printf("\n");
	printf("%d\n",sum-maxflow);
	return 0;
}

2023/8/14 19:47
加载中...