• poj3041 Asteroids 二分匹配之最小顶点覆盖


    http://poj.org/problem?id=3041

    在N*N的平面上有K颗小行星,现在你要摧毁他们,你的每一发子弹可以摧毁同一行,或者是同一列上的小行星,现在问你最少要多少子弹才能摧毁所有的小行星?
    构图:如果在i行j列上有一颗小行星 则graph[i][j]=1,再求最大匹配即可。
    这一题用到的结论是 :最小顶点覆盖 = 最大匹配(最小覆盖要求用最少的点(X集合或Y集合的都行)让每条边都至少和其中一个点关联)
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
        int nx, ny;             // X的點數目、Y的點數目
    int mx[505], my[505];   // X各點的配對對象、Y各點的配對對象
    bool vy[505];           // 紀錄Graph Traversal拜訪過的點
    bool adj[505][505];     // 精簡過的adjacency matrix

    // 以DFS建立一棵交錯樹
    bool DFS(int x)
    {
        for (int y=0; y<ny; ++y)
            if (adj[x][y] && !vy[y])
            {
                vy[y] = true;

                // 找到擴充路徑
                    if (my[y] == -1 || DFS(my[y]))
                {
                    mx[x] = y; my[y] = x;
                    return true;
                   }
            }
        return false;
    }

    int bipartite_matching()
    {
        // 全部的點初始化為未匹配點。
        memset(mx, -1, sizeof(mx));
            memset(my, -1, sizeof(my));

        // 依序把X中的每一個點作為擴充路徑的端點,
        // 並嘗試尋找擴充路徑。
        int c = 0;
        for (int x=0; x<nx; ++x)
    //     if (mx[x] == -1)    // x為未匹配點,這行可精簡。
            {
                // 開始Graph Traversal
                memset(vy, false, sizeof(vy));
                if (DFS(x)) c++;
            }
        return c;
    }
    main()
    {
              int a,b,i,n,k;
              while(scanf("%d%d",&n,&k)!=EOF)
              {
                 nx=ny=n;
                 memset(adj, 0, sizeof(adj));
                 for(i=1;i<=k;i++)
                 {
                   scanf("%d%d",&a,&b);
                   adj[a-1][b-1]=1;
                 }
                printf("%d\n",bipartite_matching());
              }
              system("pause");
       } 
        

  • 相关阅读:
    一个主板上连接两个都有引导的盘
    pytorch查看模型weight与grad
    linux终端窗口字体缩放快捷键
    vim选中多行缩进(python多行缩进)与删除多行前面的空格
    python import 包的路径以及相对路径加载的问题
    pycharm中添加PATH变量
    Atom选中多行操作
    php扩展 swoole的安装与使用
    12121212
    linux系统下清理所有Redis缓存
  • 原文地址:https://www.cnblogs.com/zxj015/p/2740297.html
Copyright © 2020-2023  润新知