网络流,我是废物,调不出来
  • 板块P3701 主主树
  • 楼主王茗仟
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/2/17 19:30
  • 上次更新2023/10/24 00:34:02
查看原帖
网络流,我是废物,调不出来
291604
王茗仟楼主2023/2/17 19:30
#include<bits/stdc++.h>
#define double long double
#define int128 __int128
#define int long long
#define re register
#define in inline
#define Pi pair<int,int>
#define vi vector<int>
#define max(a,b)  ((a)>(b)?a:b)
#define min(a,b)  ((a)<(b)?a:b)
#define ls x<<1
#define rs x<<1|1
#define dx x+xx[i]
#define dy y+yy[i]
#define debug cout<<"wuyu"<<endl;
#define s1 b1[i].id[0]
#define s2 b2[j].id[0] 
using namespace std;
const int INF=0x3f3f3f3f3f;
const int N=1e5+19;
const int M=1e6+10;
const int mod=998244353;
const double eps=1e-5;
in int read(){	re int x=0,f=0;re char c=getchar();	while(!isdigit(c)) f|=(c=='-'),c=getchar();	while(isdigit(c))  x=(x<<3)+(x<<1)+c-'0',c=getchar();	return f?-x:x;}
in void write(re int x){	if(x<0) putchar('-'),x=-x;	if(x>9) write(x/10);	putchar(x%10+'0');}



int n,m;
int s,t;

struct edge{
	int u,v,w;
	int nx;
}e[M];
int head[N],cur[M],tot=0;
int dep[N];
int xu1,xu2;

struct node{
	int h;
	string id;
}b1[101],b2[101];

in void add(re int u,re int v,re int w){
	e[++tot].u=u;
	e[tot].v=v;
	e[tot].w=w;
	e[tot].nx=head[u];
	head[u]=tot;
}

in bool bfs(){
	memset(dep,0,sizeof(dep));
	queue<int>q;
	while(!q.empty()) q.pop();
	dep[s]=1;
	q.push(s);
	while(!q.empty()){
		int u=q.front();
		q.pop();
		for(re int i=head[u];i!=-1;i=e[i].nx){
			int v=e[i].v;
			if(e[i].w>0&&dep[v]==0){
				dep[v]=dep[u]+1;
				if(v==t) return 1;
				q.push(v);
			}
		}
	}
	return 0;
}

int dfs(re int u,re int dis){
	if(u==t) return dis;
	int diss=0;
	for(re int i=head[u];i!=-1;i=e[i].nx){
		int v=e[i].v;
		
		if(e[i].w!=0&&dep[v]==dep[u]+1){
	
			int flow=dfs(v,min(dis,e[i].w));
			if(flow){
				dis-=flow;
				diss+=flow;
				e[i].w-=flow;
				e[i^1].w+=flow;
				if(dis==0) break;
			}
		}
	}
	return diss;
}

in int dinic(){
	int ans=0;
	while(bfs()){
		for(re int i=s;i<=t;i++){
			cur[i]=head[i];
			while(int dadada=dfs(s,INF)){
				ans+=dadada;
			}
		}
	}
	return ans;
}

in int pd1(int x){
	if(b1[x].id[0]=='J') return xu1;
	else return 0;
}

in int pd2(int x){
	if(b2[x].id[0]=='J') return xu2;
	else return 0;
}


signed main(){
	memset(head,0xff,sizeof(head));
	n=read();m=read();
	for(re int i=1;i<=n;i++) cin>>b1[i].id;
	for(re int i=1;i<=n;i++) cin>>b2[i].id;
	for(re int i=1;i<=n;i++) cin>>b1[i].h;
	for(re int i=1;i<=n;i++) cin>>b2[i].h;
	for(re int i=1;i<=n;i++){
		if(b1[i].id[0]=='Y') xu1++;
		if(b2[i].id[0]=='Y') xu2++;
	}
	
	s=0;t=2*n+1;
	
	for(re int i=1;i<=n;i++){
		for(re int j=1;j<=n;j++){
			if(s1=='J'&&(s2=='H'||s2=='W')) add(i,j+n,1),add(j+n,i,0);
			if(s1=='E'&&(s2=='J'||s2=='Y')) add(i,j+n,1),add(j+n,i,0);
			if(s1=='Y'&&(s2=='J'||s2=='H')) add(i,j+n,1),add(j+n,i,0);
			if(s1=='H'&&(s2=='E'||s2=='W')) add(i,j+n,1),add(j+n,i,0);
			if(s1=='W'&&(s2=='Y'||s2=='E')) add(i,j+n,1),add(j+n,i,0);
		}
	}
	
	
	for(re int i=1;i<=n;i++){
		add(s,i,b1[i].h+pd1(i));
		add(i,s,0);
		add(i+n,t,b2[i].h+pd2(i));
		add(t,i+n,0);
	}
	
	cout<<min(dinic(),m)<<endl;
	return 0;
}

















2023/2/17 19:30
加载中...