RE 46pts求救
查看原帖
RE 46pts求救
339568
TonviaSzt楼主2021/11/19 20:51
#include<cstdio>
#include<cstring>
#include<iostream>
#define inc(i,x,y) for(register LL i=x;i<=y;i++)
using namespace std;
typedef long long LL;
const LL N=505,Max=1e18;
LL n,m,tx[N],ty[N],match[N],slack[N],E[N][N];
bool vx[N],vy[N];
inline LL Rd(){
	LL s=0;int w=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
	while (ch>='0'&&ch<='9') s=(s<<1)+(s<<3)+ch-'0',ch=getchar();
	return s*w;
}
inline bool dfs(LL x){
	vy[x]=1;
	inc(i,1,n){
		if(!vx[i]){
			LL dis=tx[i]+ty[x]-E[x][i];
			if(dis) slack[i]=min(slack[i],dis);
			else{
				vx[i]=1;
				if(!match[i]||dfs(match[i])){
					match[i]=x;
					return 1;
				}
			}
		}
	}
	return 0;
}
inline LL km(){
	inc(i,1,n){
		ty[i]=E[i][1];
		inc(j,2,n) ty[i]=max(ty[i],E[i][j]);
	}
	inc(i,1,n){
		inc(j,1,n) slack[j]=Max;
		while (1){
			memset(vx,0,sizeof(vx));
			memset(vy,0,sizeof(vy));
			if(dfs(i)) break;
			LL d=Max;
			inc(j,1,n) if(!vx[j]) d=min(d,slack[j]);
			inc(j,1,n){
				if(vy[j]) ty[j]-=d;
				if(vx[j]) tx[j]+=d;
				else slack[i]-=d;
			}
		}
	}
	LL tot=0;
	inc(i,1,n) tot+=E[match[i]][i];
	return tot;
}
int main(){
	n=Rd();m=Rd();
	inc(i,1,n) inc(j,1,m) E[i][j]=-Max;
	inc(i,1,m) E[Rd()][Rd()]=Rd();
	printf("%lld\n",km());
	inc(i,1,n) printf("%lld ",match[i]);
	return 0;
}
2021/11/19 20:51
加载中...