zoukankan      html  css  js  c++  java
  • hdu 1533KM算法

    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    #define inf 0x3fffffff
    #define N 300
    int map[N][N];
    char s[N][N];
    int ss[N],tt[N],mark[N],lx[N],ly[N];
    struct node{
    int x,y;
    }man[N],hos[N];
    int link[N],n;
    int find(int u) {
    ss[u]=1;
    int i;
    for(i=1;i<=n;i++)
    if(!tt[i]&&lx[u]+ly[i]==map[u][i]) {
        tt[i]=1;
        if(link[i]==-1||find(link[i])) {
            link[i]=u;
            return 1;
        }
    }
    return 0;
    }
    int Max(int a,int b) {
    return a>b?a:b;
    }
    int Min(int a,int b) {
    return a>b?b:a;
    }
    int KM() {
        int d,i,j,k,sum=0;
        memset(link,-1,sizeof(link));
        memset(ly,0,sizeof(ly));
        for(i=1;i<=n;i++) {
                lx[i]=-inf;
            for(j=1;j<=n;j++)
            lx[i]=Max(lx[i],map[i][j]);
        }
        for(i=1;i<=n;i++) {
         while(1) {
                memset(ss,0,sizeof(ss));
            memset(tt,0,sizeof(tt));
            if(find(i))break;
            d=inf;//注意要在这里初始化
           for(j=1;j<=n;j++) {
            if(ss[j]) {
                for(k=1;k<=n;k++)
                    if(!tt[k])
                    d=Min(d,lx[j]+ly[k]-map[j][k]);
            }
           }
           for(j=1;j<=n;j++) {
            if(ss[j])lx[j]-=d;
            if(tt[j])ly[j]+=d;
           }
         }
        }
        for(i=1;i<=n;i++)
            sum=sum+map[link[i]][i];
            return -sum;
    }
    int main() {
        int m,i,j,ma,ho;
        while(scanf("%d%d",&n,&m),n||m) {
            ma=0;ho=0;
        for(i=1;i<=n;i++)
            scanf("%s",s[i]+1);
            ho=0;ma=0;
        for(i=1;i<=n;i++)
        for(j=1;j<=m;j++) {
            if(s[i][j]=='m')
                man[++ma].x=i,man[ma].y=j;
                if(s[i][j]=='H')
                    hos[++ho].x=i,hos[ho].y=j;
        }
        for(i=1;i<=ma;i++)
            for(j=1;j<=ma;j++)
            map[i][j]=-1*(fabs(1.0*man[i].x-1.0*hos[j].x)+fabs(1.0*man[i].y-1.0*hos[j].y));
            n=ma;
        printf("%d ",KM());
            }
    return 0;
    }
  • 相关阅读:
    好还是坏:人工智能二分类问题
    神经网络手写数字识别
    TensorFlow or PyTorch
    什么是深度学习
    五个常见 AI 开发库
    AI——第四次工业革命
    NodeJs获取不到POST参数
    Android权限
    【nodejs学习】3.进程管理及异步编程
    每日一题
  • 原文地址:https://www.cnblogs.com/thefirstfeeling/p/4410883.html
Copyright © 2011-2022 走看看