KM为什么会T,题解跑的飞快啊
查看原帖
KM为什么会T,题解跑的飞快啊
723509
mzw2006楼主2022/9/16 15:19
#include<bits/stdc++.h>
using namespace std;
int n,mat[25],la[25],lb[25],w[25][25],delta;
bool va[25],vb[25];
bool dfs(int x)
{
	va[x]=1;
	for(int y=1;y<=n;y++)
	{
		if(!vb[y])
		{
			if(la[x]+lb[y]==w[x][y])
			{
				vb[y]=1;
				if(!mat[y]||dfs(mat[y]))
				{
					mat[y]=x;
					return 1;
				}
			}
		}
		else
		{
			if(la[x]+lb[y]-w[x][y]>0)
			{
				delta=min(delta,la[x]+lb[y]-w[x][y]);
			}
		}
	}
	return 0;
}
void km()
{
	for(int i=1;i<=n;i++)
	{
		while(1)
		{
			delta=1<<30;
			memset(va,0,sizeof(va));
			memset(vb,0,sizeof(vb));
			if(dfs(i)) break;
			for(int j=1;j<=n;j++)
			{
				if(va[j]) la[j]-=delta;
				if(vb[j]) lb[j]+=delta;
			}
		}
	}
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			scanf("%d",&w[i][j]);
		}
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			int t;
			scanf("%d",&t);
			w[j][i]*=t;
		}
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			la[i]=max(la[i],w[i][j]);
		}
	}
	km();
	int ans=0;
	for(int i=1;i<=n;i++)
	{
		ans+=w[mat[i]][i];
	}
	printf("%d",ans);
	return 0;
}
2022/9/16 15:19
加载中...