• POJ3041 Asteroids


    gate

    用时:看了题解之后20min左右吧...

    给一个(N imes N)的网格,有(k)个障碍物,每次可以消灭一行或一列的障碍物,问至少几次可以清空。
    把横、纵分为两个点集,每个障碍物((i,j))即在(i,j)连一条边。
    (Konig定理):最小覆盖数 = 最大匹配数
    求二分图匹配即可。

    code

    #include<cstdio>
    #include<iostream>
    #include<cmath>
    #include<cstring>
    #define MogeKo qwq
    using namespace std;
    
    const int maxn = 505;
    int n,k,x,y,ans,cp[maxn];
    bool vis[maxn],to[maxn][maxn];
    
    bool find(int x){
        for(int i = 1;i <= n;i++)
            if(to[x][i] && !vis[i]){
                vis[i] = true;
                if(!cp[i] || find(cp[i])){
                    cp[i] = x;
                    return true;
                }
            }
        return false;
    }
    
    int main(){
        scanf("%d%d",&n,&k);
        for(int i = 1;i <= k;i++){
            scanf("%d%d",&x,&y);
            to[x][y] = true;
        }
        for(int i = 1;i <= n;i++){
            memset(vis,0,sizeof(vis));
            if(find(i)) ans++;
        }
        printf("%d
    ",ans);
        return 0;
    }
    
  • 相关阅读:
    IOS性别
    IOS生命周期
    读书的作用
    Core Data
    解析Json数据
    sicily Knight Moves
    sicily 简单魔板2
    Sum of Consecutive Primes
    [OI笔记]杂题整理1(基础篇~)
    [IOI1994]The Castle
  • 原文地址:https://www.cnblogs.com/mogeko/p/13261340.html
Copyright © 2020-2023  润新知