T了两个点实在是调不动了QAQ
查看原帖
T了两个点实在是调不动了QAQ
229446
ephemere楼主2020/9/24 21:16
#include<bits/stdc++.h>
using namespace std;

const int N=100005,M=1e7+5,INF=1e9;
int n,m,st,ed,Flow,Cost;
int dis[N],tail[N];
int te=1,v[M],w[M],f[M],pre[M];
bool vis[N],bz[M];

int a[50][105],sum,up,b[50],id,cnt[105],num[N];

inline void add(int U,int V,int W,int F)
{
	++te;
//	check[te]=U;
	v[te]=V;w[te]=W;f[te]=F;pre[te]=tail[U];
	tail[U]=te;
}
inline void add_(int x)
{
	num[++id]=x;
	cnt[x]++;
	
	add(id,ed,0,1);
	add(ed,id,0,0);
	
	for(int i=1;i<=n;++i)
	add(i,id,cnt[x]*a[i][x],1),
	add(id,i,-cnt[x]*a[i][x],0);
}

int now[N];
bool spfa()
{	
	for(int i=st;i<=id;++i) now[i]=tail[i],dis[i]=INF,vis[i]=0;
	
	deque<int>q;
	
	dis[ed]=0;
	q.push_back(ed);
	
	while(q.size())
	{
		int u=q.front();
		q.pop_front();
		
		vis[u]=0;
		
		for(int i=tail[u];i;i=pre[i])
		if(f[i^1]&&dis[v[i]]>dis[u]-w[i])
		{
			dis[v[i]]=dis[u]-w[i];
	
			if(!vis[v[i]])
			{
				vis[v[i]]=1;
				if(q.empty()||dis[q.front()]<dis[v[i]])q.push_back(v[i]);
				else q.push_front(v[i]);
			}
		}
	}
	
	return dis[st]<INF;
}

inline int dfs(int u,int val)
{
	if(u==ed)return val;
	
	vis[u]=1;
	
	int rest=val;
	for(int &i=now[u];i&&rest;i=pre[i])
	if(!vis[v[i]]&&f[i]&&dis[v[i]]+w[i]==dis[u])
	{
		int d=dfs(v[i],min(f[i],rest));
		
		if(!d) dis[v[i]]=0;
		else rest-=d,f[i]-=d,f[i^1]+=d;
	}
	
	vis[u]=0;
	return val-rest;
}

void init()
{
	scanf("%d %d",&n,&m);
	
	st=0;ed=n*m+n+1;
	
	for(int i=1,x;i<=n;++i) scanf("%d",&b[i]),sum+=b[i],up=max(up,b[i]),add(st,i,0,b[i]),add(i,st,0,0);

	for(int i=1;i<=n;++i)
	for(int j=1;j<=m;++j)
	scanf("%d",&a[i][j]);
	
	id=n;
	for(int j=1;j<=m;++j)
	{
		cnt[j]=1,num[++id]=j,
		add(id,ed,0,1),add(ed,id,0,0);
	
		for(int i=1;i<=n;++i)
		add(i,id,a[i][j],1),add(id,i,-a[i][j],0);
	}
}


void work()
{
    while(spfa())
	{
		int d=dfs(st,INF);
		
		for(int i=st;i<=id;++i) vis[i]=0;
		
		Flow+=d;
		Cost+=d*dis[st];
	
		for(int i=tail[ed];i;i=pre[i])
		if(f[i]&&!bz[i]) bz[i]=1,add_(num[v[i]]);
	}
}

int main()
{
	init();
	work();
	
	printf("%d",Cost);
}
2020/9/24 21:16
加载中...