求KM算法的matlab实现 急 80
2个回答
展开全部
matlab跟C差不多的,我会C,但是matlab不是很熟悉,怕误导你,就不写matlab的了,把C的给你
const int maxn=20,INF=2147483647;
int w[maxn][maxn];
int lx[maxn]={0},ly[maxn]={0}; //顶标
int linky[maxn];
int visx[maxn],visy[maxn];
int lack;
bool find(int x){
visx[x]=true;
for(int y=0;y<maxn; y++){
if(visy[y])continue;
int t=lx[x]+ly[y]-w[x][y];
if(t==0){
visy[y]=true;
if(linky[y]==-1||find(linky[y])){
linky[y]=x;
return true;
}
}
else if(lack>t)lack=t;
}
return false;
}
void KM(){
memset(linky,-1,sizeof(linky));
for(int i=0;i<maxn; i++)
for(int j=0;j<maxn; j++)
if(w[i][j]>lx[i])
lx[i]=w[i][j]; //初始化顶标
for(int x=0;x<maxn; x++){
for(;;){
memset(visx,0,sizeof(visx));
memset(visy,0,sizeof(visy));
lack=INF;
if(find(x))break;
for(int i=0;i<maxn; i++){
if(visx[i])lx[i]-=lack;
if(visy[i])ly[i]+=lack;
}
}
}
}
希望可以帮到你,不懂再问哈~
const int maxn=20,INF=2147483647;
int w[maxn][maxn];
int lx[maxn]={0},ly[maxn]={0}; //顶标
int linky[maxn];
int visx[maxn],visy[maxn];
int lack;
bool find(int x){
visx[x]=true;
for(int y=0;y<maxn; y++){
if(visy[y])continue;
int t=lx[x]+ly[y]-w[x][y];
if(t==0){
visy[y]=true;
if(linky[y]==-1||find(linky[y])){
linky[y]=x;
return true;
}
}
else if(lack>t)lack=t;
}
return false;
}
void KM(){
memset(linky,-1,sizeof(linky));
for(int i=0;i<maxn; i++)
for(int j=0;j<maxn; j++)
if(w[i][j]>lx[i])
lx[i]=w[i][j]; //初始化顶标
for(int x=0;x<maxn; x++){
for(;;){
memset(visx,0,sizeof(visx));
memset(visy,0,sizeof(visy));
lack=INF;
if(find(x))break;
for(int i=0;i<maxn; i++){
if(visx[i])lx[i]-=lack;
if(visy[i])ly[i]+=lack;
}
}
}
}
希望可以帮到你,不懂再问哈~
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询