zoukankan      html  css  js  c++  java
  • POJ_3041_Asteroids

    参考自: http://user.qzone.qq.com/289065406/blog/1299322465

    解题思路:

    把方阵看做一个特殊的二分图(以行列分别作为两个顶点集V1、V2,其中| V1|=| V2|)

    然后把每行x或者每列y看成一个点,而障碍物(x,y)可以看做连接x和y的边。按照这种思路构图后。问题就转化成为选择最少的一些点(x或y),使得从这些点与所有的边相邻,其实这就是最小点覆盖问题。

    再利用二分图最大匹配的König定理:

    最小点覆盖数 = 最大匹配数

    (PS:最小点覆盖:假如选了一个点就相当于覆盖了以它为端点的所有边,你需要选择最少的点来覆盖图的所有的边。)

      

    因此本题自然转化为求 二分图的最大匹配 问题

     

    求最大匹配的一种显而易见的算法是:先找出全部匹配,然后保留匹配数最多的。但是这个算法的时间复杂度为边数的指数级函数

    因此,需要寻求一种更加高效的算法——增广路求最大匹配的方法(匈牙利算法)

    增广路的定义(也称增广轨或交错轨):

    若P是图G中一条连通两个未匹配顶点的路径,并且属于M的边和不属于M的边(即已匹配和待匹配的边)在P上交替出现,则称P为相对于M的一条增广路径。

     由增广路的定义可以推出下述三个结论:

     1、P的路径个数必定为奇数,第一条边和最后一条边都不属于M。

       2、将M和P进行取反操作可以得到一个更大的匹配M’

          (反操作:把P中的 匹配边 与 非匹配边 互换)

       3、M为G的最大匹配当且仅当不存在M的增广路径P

    匈牙利算法轮廓:

      (1)置M为空

      (2)找出一条增广路径P,通过异或操作获得更大的匹配M’代替M

      (3)重复(2)操作直到找不出增广路径为止

     代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    #define Del(x,y) memset(x,y,sizeof(x))
    int map[505][505],vis[505],link[505];
    int n,k;
    
    bool dfs(int x)
    {
        for(int i=1;i<=n;i++)
            if(map[x][i]==1&&vis[i]==0)
        {
            vis[i]=1;
            if(link[i]==-1||dfs(link[i]))
            {
                link[i]=x;
                return true;
            }
        }
        return false;
    }
    
    void solve()
    {
        int ans=0;
        Del(link,-1);
        for(int i=1;i<=n;i++)
        {
            Del(vis,0);
            if(dfs(i))
                ans++;
        }
        printf("%d
    ",ans);
    }
    
    int main()
    {
        int r,c;
        scanf("%d%d",&n,&k);
        Del(map,0);
        while(k--)
        {
            scanf("%d%d",&r,&c);
            map[r][c]=1;
        }
        solve();
        return 0;
    }
  • 相关阅读:
    02-qiankun-gitsubmodule使用及部署流程
    01-eslint/vetur/preitter/vscode配置
    01-mac m1 安装nvm / node-sass报错
    17-JS数组方法,是否改变原数组归纳
    03-webpack之require.context()实现前端工程自动化
    最小生成树prim算法
    bfs
    数据结构实验三题目一
    邻接表
    邻接矩阵
  • 原文地址:https://www.cnblogs.com/jasonlixuetao/p/4756160.html
Copyright © 2011-2022 走看看