zoukankan      html  css  js  c++  java
  • 匈牙利算法 二分图问题(最小顶点覆盖,最小边覆盖,最大独立集)

    ADT:

     1 const int maxn = 150; //表示集合x,y中顶点个数的最大值
     2 
     3 int n,m; // n,m分别表示 x,y中顶点个数
     4 bool g[maxn][maxn]; //邻接矩阵,1表示有连接
     5 int cx[maxn];//最大匹配中,与x集合中x[i]匹配的y集合中顶点的索引
     6 int cy[maxn];
     7 
     8 int mk[maxn];//dfs算法中记录顶点访问状态的数据, 0未访问
     9 
    10 bool dfs(int u){ //用来寻找增广路
    11     for(int i=0;i<m;i++){ //考虑y中所有顶点
    12         if(g[u][i]&&!mk[i]){
    13             mk[i] = 1; //访问
    14             if(cy[i]==-1||dfs(cy[i])){ //未匹配则将i匹配给u,不然从cy[i]也就是说i之前已经匹配的x出发,找增广路,注意这里i已经记录访问过了
    15                 cx[u] = i; //把i匹配给u
    16                 cy[i] = u; //相互匹配
    17                 return 1;
    18             }
    19         }
    20     }
    21     return 0; //如果不存在u出发的增广路,返回0
    22 }
    23 
    24 int Hungarian(){
    25     int res = 0;
    26     memset(cx,-1,sizeof(cx));
    27     memset(cy,-1,sizeof(cy));
    28     for(int i=0;i<n;i++){
    29         if(cx[i]==-1){ //从x中每个没有匹配的店出发寻找增广路
    30             memset(mk,0,sizeof(mk));
    31             res += dfs(i); //return 为0或1,所以有dfs,就加一
    32         }
    33     }
    34     return res;
    35 }
    View Code

    参考链接:blog.csdn.net/flynn_curry/article/details/52966283 二分图应用

    http://blog.csdn.net/thundermrbird/article/details/52231639 二分图理解

  • 相关阅读:
    浏览器渲染页面
    递归求1-100之和
    border属性
    ES6 Class
    数组去重
    get、post请求
    对象冒充继承
    原型链继承
    实现JS数据拷贝
    【转】centos升级curl版本
  • 原文地址:https://www.cnblogs.com/cmbyn/p/8623925.html
Copyright © 2011-2022 走看看