hdu2255 (二分图最优匹配)

来源:互联网 发布:nginx安装ssl模块 编辑:程序博客网 时间:2024/05/21 16:58

Kuhn Munkras算法

纯模板题。具体实现还不太懂,先贴模板。有空再研究。

很好的参考资料:http://www.cnblogs.com/skyming/archive/2012/02/18/2356919.html

#include <iostream>#include <stdio.h>#include <string.h>#include <map>#include <math.h>#include <algorithm>using namespace std;#define N 310int mp[N][N];bool visx[N],visy[N];int lx[N],ly[N];int match[N];int n;bool Hungary(int u){//匈牙利算法    visx[u]=1;    for(int i=0;i<n;i++){        if(!visy[i] && lx[u]+ly[i]==mp[u][i]){            visy[i]=1;            if(match[i] == -1||Hungary(match[i])){                match[i]=u;                return true;            }//if        }//if    }//for    return false;}void KM_perfect_match(){    int temp;    memset(lx,0,sizeof(lx));    memset(ly,0,sizeof(ly));    for(int i=0;i<n;i++)//lx[i]为权值最大的边        for(int j=0;j<n;j++)            lx[i]=max(mp[i][j],lx[i]);    for(int i=0;i<n;i++){//对n个点匹配        while(1){            memset(visx,0,sizeof(visx));            memset(visy,0,sizeof(visy));            if(Hungary(i)) break;//匹配成功            else{//匹配失败,找最小值                temp = INT_MAX;                for(int j=0;j<n;j++) if(visx[j])//x在交错树中                    for(int k=0;k<n;k++)                    if(!visy[k]&&temp>lx[j]+ly[k]-mp[j][k])                        temp=lx[j]+ly[k]-mp[j][k];                for(int j=0;j<n;j++){//更新定标                    if(visx[j]) lx[j]-=temp;                    if(visy[j]) ly[j]+=temp;                }            }//else        }//while    }}int main(){    int ans;    while(scanf("%d",&n)!=EOF){        ans=0;        memset(match,-1,sizeof(match));        for(int i=0;i<n;i++) for(int j=0;j<n;j++) scanf("%d",&mp[i][j]);        KM_perfect_match();        for(int i=0;i<n;i++) ans+=mp[match[i]][i];        printf("%d\n",ans);    }    return 0;}


0 0
原创粉丝点击