zoukankan      html  css  js  c++  java
  • KM算法模版

     1 #include<iostream>
     2 #include<cstring>
     3 #define N 500
     4 using namespace std;
     5 
     6 int n,w[N][N];
     7 int lx[N],ly[N],f[N];bool vx[N],vy[N];
     8 
     9 int Search(int k){
    10     vx[k]=1;
    11     
    12     for(int i=1;i<=n;++i)
    13     if(!vy[i]&&lx[k]+ly[i]==w[k][i])
    14     {
    15       if(f[i]==-1||Search(f[i]))
    16       {f[i]=k;return 1;}       
    17                                     }
    18     return 0;
    19     }
    20 
    21 long KM(int p){
    22      if(!p)
    23      {
    24        for(int i=1;i<=n;++i)
    25        for(int j=1;j<=n;++j)
    26        w[i][j]=-w[i][j];
    27            }
    28      
    29      for(int i=1;i<=n;++i)
    30      {
    31        lx[i]=-100000000;
    32        for(int j=1;j<=n;++j)
    33        if(lx[i]<w[i][j]) lx[i]=w[i][j];    
    34        ly[i]=0;
    35              }
    36      
    37      memset(f,-1,sizeof(f));
    38      for(int i=1;i<=n;++i)
    39      {
    40        while(1)
    41        {
    42          memset(vx,0,sizeof(vx));
    43          memset(vy,0,sizeof(vy));
    44          
    45          if(Search(i)) break;
    46          
    47          int mi=100000000;
    48          for(int j=1;j<=n;++j)
    49          if(vx[j])
    50          for(int k=1;k<=n;++k)
    51          if(!vy[k]&&lx[j]+ly[k]-w[j][k]<mi)
    52          mi=lx[j]+ly[k]-w[j][k];
    53          
    54          if(mi==0) {cout<<"NO ANSWER!"<<endl;return 0;}
    55          for(int j=1;j<=n;++j)
    56          {
    57            if(vx[j]) lx[j]-=mi;
    58            if(vy[j]) ly[j]+=mi;
    59                  }
    60                }
    61              }
    62      
    63      int sum=0;
    64      for(int i=1;i<=n;++i)
    65      if(f[i]>0)
    66      sum+=w[f[i]][i];
    67      
    68      if(!p) return -sum;
    69      return sum;  
    70      } 
    71 
    72 int main()
    73 {
    74     cin>>n;
    75     for(int i=1;i<=n;++i)
    76     for(int j=1;j<=n;++j)
    77     cin>>w[i][j];
    78     
    79     cout<<KM(1)<<endl;   //最大 
    80     cout<<KM(0)<<endl;   //最小
    81     system("pause");
    82     return 0; 
    83     
    84     } 
  • 相关阅读:
    SSM中shiro的基本使用
    TortoiseGit小乌龟 git管理工具
    vux用法
    vue webpack打包
    vue2.0 watch
    vue2.0 $emit $on组件通信
    简单工具 & 杂技
    html基础问题总结
    Node应用进程管理器pm2的使用
    node express 登录拦截器 request接口请求
  • 原文地址:https://www.cnblogs.com/noip/p/2734688.html
Copyright © 2011-2022 走看看