km算法求调
查看原帖
km算法求调
511408
Rash10楼主2022/10/12 23:11

只过了2,3两个点,其他全T,但自己造数据测好像跑得又没那么慢

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=26;
int n,ans,kkk;
int a[N][N];
int bz[N],by[N],fd[N],upd[N];
int visz[N],visy[N];
bool dfs(int now){
	visz[now]=1;
	for(int i=1;i<=n;i++){
		if(visy[i]==0){
			if(bz[now]+by[i]==a[now][i]){	
				visy[i]=1;
				if(fd[i]==0||dfs(fd[i])==true){
					fd[i]=now;
					return true;
				}
			}
			else if(bz[now]+by[i]>a[now][i])
			{
				kkk=min(kkk,bz[now]+by[i]-a[now][i]);
			}
		}
	}
	return false;
}
void km(){
	for(int i=1;i<=n;i++){
		while(1){
			kkk=1e10;
			for(int j=1;j<=n;j++)
				visz[j]=0,visy[j]=0;
			if(dfs(i)==true)
				break;
			for(int j=1;j<=n;j++){
				if(visy[j]==1)
					kkk=min(kkk,upd[j]);
			}	
			for(int j=1;j<=n;j++){
				if(visz[j]==1)
					bz[j]-=kkk;
				if(visy[j]==1)
					by[j]+=kkk;
			}
		}
	}
}
signed main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cin>>a[i][j];
		}
	}

	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			int k;
			cin>>k;
			a[j][i]*=k;
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			bz[i]=max(bz[i],a[i][j]);
			by[i]=0;
		}
	}
	km();
	for(int i=1;i<=n;i++)
		ans+=a[fd[i]][i];
	cout<<ans;
	return 0;
}
/*
3
10 2 3
2 3 4
3 4 5
2 2 2
3 5 3
4 5 1
*/
2022/10/12 23:11
加载中...