const int MAX=1024;
int n;
int w[MAX][MAX];
int A[MAX],B[MAX];
bool visitx[MAX],visity[MAX];
int match[MAX];
void init(int size)
{
n=size;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
cin>>w[i][j];
}
bool dfs(int u)
{
visitx[u]=true;
for(int v=0;v<n;v++)
if(!visity[v]&&A[u]+B[v]==w[u][v])
{
visity[v]=true;
if(match[v]==-1||dfs(match[v]))
{
match[v]=u;
return 1;
}
}
return false;
}
int km(bool maxsum)
{
int i,j;
if(!maxsum)
for(i=0;i<n;i++)
for(j=0;j<n;j++)
w[i][j]=-w[i][j];
for(i=0;i<n;i++)
{
A[i]=-0x1ffffff;
B[i]=0;
for(j=0;j<n;j++)
if(A[i]<w[i][j])
A[i]=w[i][j];
}
memset(match,-1,sizeof(match));
for(int u=0;u<n;u++)
while(1)
{
memset(visitx,0,sizeof(visitx));
memset(visity,0,sizeof(visity));
if(dfs(u))
break;
int d=0x7fffffff;
for(i=0;i<n;i++)
if(visitx[i])
for(j=0;j<n;j++)
if(!visity[j])
d=min(A[i]+B[j]-w[i][j],d);
for(i=0;i<n;i++)
{
if(visitx[i])
A[j]-=d;
if(visity[i])
B[i]+=d;
}
}
int ans=0;
for(i=0;i<n;i++)
ans+=w[match[i]][i];
if(!maxsum)
{
ans=-ans;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
w[i][j]=-w[i][j];
}
return ans;
}
KM算法
最新推荐文章于 2019-03-21 17:10:47 发布