zoukankan      html  css  js  c++  java
  • 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");
       } 
        

  • 相关阅读:
    JMeter常用函数__uuid()
    JMeter常用函数__time()
    Executing a stored procedure with an output parameter using Entity Framework
    编程语言API,你最青睐哪一款?
    开发者最爱的三款开发工具
    Arrow:轻量级的Python时间日期库
    专家观点:HTML5无法彻底抹杀Native应用
    iPhone的13个隐秘功能
    安装SQL server出现的问题及解决方法
    用vb编写的qq靠边隐藏功能
  • 原文地址:https://www.cnblogs.com/zxj015/p/2740297.html
Copyright © 2011-2022 走看看