费用流18pts求助
查看原帖
费用流18pts求助
227723
syysongyuyang楼主2022/11/6 16:48

rt

萌新刚学网络流,求大佬捞捞

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<vector>
#include<queue>
#include<stack>
#include<cmath>
#include<bitset>
#include<map>
using namespace std;
typedef long long ll;
const int N=1e3+5;
const int M=1e4+5;
const int INF=0x3f3f3f3f;
struct Edge{
    int v,w,c,next;
}edge[M];
int n,tot=1,s,t,ans=0,ret=0;
int head[N],cur[N],d[N],vis[N],p[N][N],q[N][N];
inline void add(int u,int v,int w,int c){
    edge[++tot]=(Edge){v,w,c,head[u]},head[u]=tot;
    edge[++tot]=(Edge){u,0,-c,head[v]},head[v]=tot;
}
inline int read(){
    int s=0,f=1;char ch=getchar();
    while(!isdigit(ch)) {if(ch=='-') {f=-1;} ch=getchar();}
    while(isdigit(ch)) {s=(s<<1)+(s<<3)+ch-'0'; ch=getchar();}
    return s*f;
}
inline void write(int x){
    int top=0,sta[35];
    while(x) {sta[top++]=x%10,x/=10;}
    while(top) {putchar(sta[--top]+'0');}
}
inline int SPFA()
{
	queue <int> q;
	memset(d,0x3f,sizeof(d));
	memcpy(cur,head,sizeof(head));
	q.push(s),d[s]=0;
	while (!q.empty())
	{
		int u=q.front();q.pop();
		vis[u]=0;
		for (int i=head[u];i;i=edge[i].next)
		{
			int v=edge[i].v;
			if (d[v]>d[u]+edge[i].c && edge[i].w)
			{
				d[v]=d[u]+edge[i].c;
				if (!vis[v])
				{
					q.push(v);
					vis[v]=1;
				}
			}
		}
	}
	return d[t]==INF?0:1;
}
inline int Dinic(int u,int f)
{
	if (u==t) return f;
	vis[u]=1;int k,res=0;
	for (int i=cur[u];i && f;i=edge[i].next)
	{
		int v=edge[i].v;cur[u]=i;
		if (!vis[v] && edge[i].w && d[v]==d[u]+edge[i].c)
		{
			k=Dinic(v,min(f,edge[i].w));
			if (!k) {d[v]=INF;continue;}
			edge[i].w-=k,edge[i^1].w+=k;
			res+=k,f-=k;ret+=edge[i].c*k;
		}
	}
	vis[u]=0;
	return res;
}
int main()
{
    n=read();s=0,t=n*2+1;
    for (int i=1;i<=n;i++)
        for (int j=1;j<=n;j++) p[i][j]=read();
    for (int i=1;i<=n;i++)
        for (int j=1;j<=n;j++) q[i][j]=read();
    for (int i=1;i<=n;i++)
    {
        for (int j=1;j<=n;j++)
            add(i,j+n,1,-(p[i][j]*q[i][j]));
    }
    for (int i=1;i<=n;i++) add(s,i,1,0);
    for (int i=1;i<=n;i++) add(i+n,t,1,0);
    while (SPFA()) ans+=Dinic(s,INF);
    printf("%d",-ret);
    return 0;   
}
2022/11/6 16:48
加载中...