KM(n^4)模板

来源:互联网 发布:打车软件有几种 编辑:程序博客网 时间:2024/06/06 02:19
#include<iostream>#include<cstdio>#include<cstring>#include<cmath>using namespace std;const int inf=10000000;int lx[301],ly[301];int a[301][301],vx[301],vy[301];int n;int match[301];int MAX(int x,int y){    return x>y?x:y;}int MIN(int x,int y){    return x<y?x:y;}int dfs(int x){      int i,j,k,m;vx[x]=1;      for(i=1;i<=n;i++)          if(!vy[i] && lx[x]+ly[i]==a[x][i]){              vy[i]=1;              if(!match[i] || dfs(match[i])){                  match[i]=x;                  return 1;              }          }      return 0;  }  int main(){int i,j,k,m;cin>>n;int max=0;for(i=1;i<=n;i++){max=0;    for(j=1;j<=n;j++){  cin>>a[i][j];  max=MAX(max,a[i][j]);}    lx[i]=max;}for(k=1;k<=n;k++){    while(1){    for(i=1;i<=n;i++){  vx[i]=0;  vy[i]=0;}     if(dfs(k))break;    int min=inf;    for(i=1;i<=n;i++)      if(vx[i])        for(j=1;j<=n;j++)          if(!vy[i])            min=MAX(min,(lx[i]+ly[j]-a[i][j]));    if(min==inf){    cout<<"-1"<<endl;    return 0;}for(i=1;i<=n;i++)                  if(vx[i])lx[i]-=min;              for(i=1;i<=n;i++)                  if(vy[i])ly[i]+=min;}}int ans=0;for(i=1;i<=n;i++)ans+=a[match[i]][i];cout<<ans<<endl;return 0;}

1 0
原创粉丝点击