zoukankan      html  css  js  c++  java
  • poj 3041 Asteroids (最小点覆盖)

    链接:poj 3041

    题意:有一个n*n的矩阵,在矩阵上有m个行星,一个武器能够消灭同一行或者同一列的星星

    求最小的要用多少武器消灭全部的星星

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

    然后把每行x或者每列y看成一个点,而障碍物(x,y)能够看做连接x和y的边。依照这样的思路建图,问题就转化成为选择最少的一些点(x或y)。使得从这些点与全部的边相邻,事实上这就是最小点覆盖问题。

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

    这样本题就转化为求最大匹配数了

    1. #include<stdio.h>  
    2. #include<string.h>  
    3. int edge[550][550],n,used[550],link[550];  
    4. int dfs(int pos)  
    5. {  
    6.     int i;  
    7.     for(i=1;i<=n;i++)  
    8.         if(edge[pos][i]&&!used[i]){  
    9.             used[i]=1;  
    10.             if(link[i]==-1||dfs(link[i])){  
    11.                 link[i]=pos;  
    12.                 return 1;  
    13.             }  
    14.         }  
    15.     return 0;  
    16. }  
    17. int main()  
    18. {  
    19.     int i,a,b,s,m;  
    20.     scanf("%d%d",&n,&m);  
    21.     memset(edge,0,sizeof(edge));  
    22.     for(i=0;i<m;i++){  
    23.         scanf("%d%d",&a,&b);  
    24.         edge[a][b]=1;  
    25.     }  
    26.     s=0;  
    27.     memset(link,-1,sizeof(link));  
    28.     for(i=1;i<=n;i++){  
    29.         memset(used,0,sizeof(used));  
    30.         s+=dfs(i);  
    31.     }  
    32.     printf("%d ",s);  
    33.     return 0;  
    34. }  
  • 相关阅读:
    Flume案例:目录文件到HDFS
    Flume案例:本地文件到HDFS
    12c多租户架构下部署GoldenGate12c
    ogg_sqlserver_oracle_winerver2008
    ogg异构oracle-mysql
    搜索引擎 反向索引,为什么称之为反向索引?
    ORACLE 11G 之DATAGUARD搭建逻辑standby
    Java并发锁控制API详解
    Java中的锁分类与使用
    Spring Cloud入门(含案例介绍及源码)
  • 原文地址:https://www.cnblogs.com/cynchanpin/p/7001848.html
Copyright © 2011-2022 走看看