• [Usaco2005 Nov]Asteroids


    矩阵上有一些小行星,占据了一些格子,我们每次操作可以清理一列中的所有小行星,

    也可以清理一行中的所有小行星,问最少进行多少次操作可以清理掉所有的小行星。
    Input
    * Line 1: Two integers N and K, separated by a single space.
    * Lines 2..K+1: Each line contains two space-separated integers R and
    C (1 <= R, C <= N) denoting the row and column coordinates of
    an asteroid, respectively.
    Output
    * Line 1: The integer representing the minimum number of times Bessie must shoot.
    Sample Input
    3 4
    1 1
    1 3
    2 2
    3 2

    INPUT DETAILS:
    The following diagram represents the data, where "X" is an
    asteroid and "." is empty space:
    X.X
    .X.
    .X.
    Sample Output
    2
    OUTPUT DETAILS:
    Bessie may fire across row 1 to destroy the asteroids at (1,1) and
    (1,3), and then she may fire down column 2 to destroy the asteroids
    at (2,2) and (3,2).

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    using namespace std;
     
    int n,k,tot,ans,now[501],prep[10001],son[10001],match[501];
    bool v[501];
     
    void add(int,int);
    void add(int x,int y)
    {
         tot++;
         prep[tot]=now[x];
         now[x]=tot;
         son[tot]=y;
    }
     
    bool find(int);
    bool find(int x)
    {
         int p,so;
         p=now[x];
         while (p!=0)
         {
                 so=son[p];
                 if (v[so]==false)
                 {
                      v[so]=true;
                      if (match[so]==0||find(match[so]))
                      {
                              match[so]=x;
                              return true;
                      }
                 }
                 p=prep[p];
         }
         return false;
    }
     
    int main()
    {
        int a,b;
        scanf("%d%d",&n,&k);
        memset(now,0,sizeof(now));
        tot=0;
        for (int i=1;i<=k;i++)
        {
              scanf("%d%d",&a,&b);
              add(a,b);
        }
        ans=0;
        for (int i=1;i<=n;i++)
        {
              memset(v,0,sizeof(v));
              if (find(i))
              {
                     ans++;
              }
        }
        printf("%d
    ",ans);
        return 0;
    }
    

      

  • 相关阅读:
    矩阵相关计算-基础
    列表-元祖-字典
    Python制作NTF传递函数工况文件和后处理文件
    C++栈和堆的生长方向
    malloc/free与new/delete的区别
    C++中4个类型转换相关的关键字/特点/应用场合
    Python 拾遗
    Python 常用库
    Python 视频转字符动画
    Python 命令行(CLI)基础库
  • 原文地址:https://www.cnblogs.com/cutemush/p/12738259.html
Copyright © 2020-2023  润新知