A - Fire Net - hdu 1045(二分图匹配)

题意:一个阵地可以向四周扫射,求出来最多能修多少个阵地,墙不可以被扫射透,阵地不能同行或者或者列(有墙隔着例外)

分析:很久以前就做过这道题。。当时是练习深搜来着,不过时间复杂度比较高,现在再看突然发现原来可以用二分图匹配来做,时间soso的

******************************************************************

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;

const int MAXN = 105;
const int oo = 1e9;

bool G[MAXN][MAXN], used[MAXN];
int p[MAXN], x, y;
struct node{int x, y;}a[MAXN][MAXN];

bool Find(int u)
{///匈牙利算法匹配
    for(int i=1; i<=y; i++)
    {
        if(G[u][i] && used[i] == false)
        {
            used[i] = true;
            if(!p[i] || Find(p[i]))
            {
                p[i] = u;
                return true;
            }
        }
    }

return false;
}

int main()
{
    int N;

while(scanf("%d", &N), N)
    {
        int i, j;
        char s[MAXN][MAXN];

for(i=0; i<N; i++)
            scanf("%s", s[i]);

x = y = 0;

for(i=0; i<N; i++)
        for(j=0; j<N; j++)
        {///把图分割,以相连的‘.’为行和列重新分配编号
            if(s[i][j] == ‘.‘)
            {
                if(j == 0 || s[i][j-1] == ‘X‘)
                    x++;
                a[i][j].x = x;
            }
            if(s[j][i] == ‘.‘)
            {
                if(j == 0 || s[j-1][i] == ‘X‘)
                    y++;
                a[j][i].y = y;
            }
        }

memset(G, 0, sizeof(G));

for(i=0; i<N; i++)
        for(j=0; j<N; j++)
        {
            if(s[i][j] == ‘.‘)
            {
                int u = a[i][j].x;
                int v = a[i][j].y;
                G[u][v] = true;///用行匹配列
            }
        }

int ans = 0;
        memset(p, 0, sizeof(p));
        for(i=1; i<=x; i++)
        {
            memset(used, false, sizeof(used));
            if( Find(i) == true )
                ans++;
        }

printf("%d\n", ans);
    }

return 0;

}

时间: 2024-10-29 19:07:08

A - Fire Net - hdu 1045(二分图匹配)的相关文章

Fire Net HDU 1045

简单深搜,可以完全暴力,不会超时的. #include<iostream> #include<cstring> #include<cmath> using namespace std; #define MAX(a,b) (a>b?a:b) char maze[10][10]; int n, maxn; void DFS(int step,int count); int cheak(int x, int y); int main() { int i; while(s

hdu 1045 &amp;&amp; zoj 1002 Fire Net(DFS &amp;&amp; 二分图匹配)

Fire Net Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7958    Accepted Submission(s): 4542 Problem Description Suppose that we have a square city with straight streets. A map of a city is a

hdu 2063 二分图匹配

题意:一些女的和一些男的有好感,有好感的能一起坐过山车,问最多能组成多少对 hdu 11 页上少有的算法题,二分图匹配问题,匈牙利算法,对于每一个汉子,看和他有好感的妹子有没有配对了,没有配对过就可以成功配对,若已经配对过了,就看那个妹子所配对的汉子能不能再找个没有配对的妹子,如果可以就拆散当前配对重组配对,否则就不能拆:如果找完所有有好感的妹子仍然没能配对成功,那这个汉子就注定孤独一生了``` 1 #include<stdio.h> 2 #include<string.h> 3

hdu 1281 二分图匹配

题目:在保证尽量多的“车”的前提下,棋盘里有些格子是可以避开的,也就是说,不在这些格子上放车,也可以保证尽量多的“车”被放下.但是某些格子若不放子,就 无法保证放尽量多的“车”,这样的格子被称做重要点.Gardon想让小希算出有多少个这样的重要点,你能解决这个问题么? 二分图匹配居然还能这么用!!!脑洞大开啊!!! 思路:把棋盘的行x看成二分图左边的点,列y看成二分图右边的点,那么就把可以放车的位置看成是一条边,而二分图的最大匹配中x互不相同,y 互不相同,所以每个匹配都是不同行不同列,所以最大

(匹配)Fire Net --hdu --1045

链接: http://acm.hdu.edu.cn/showproblem.php?pid=1045 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82834#problem/A 一看原题,先用搜索写一下,还是要学学匹配吧! 以前的代码: #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> us

Fire Net HDU - 1045(二分匹配)

把每一列中相邻的 .  缩为一个点 作为二分图的左边 把每一行中相邻的  .  缩为一个点 作为二分图的右边 然后求最大匹配即可 这题用匈牙利足够了...然而..我用了hk...有点大材小用的感觉/// #include <iostream> #include <cstdio> #include <cstring> #include <queue> #include <vector> #include <cmath> #include

hdu 4185 二分图匹配

题意用1*2的木板覆盖矩阵中的‘#’,(木板要覆盖的只能是‘#’),问最多能用几个木板覆盖 将#抽象为二分图的点,一个木板就是一个匹配,注意最后结果要除以2 Sample Input 1 6 ...... .##... .##... ....#. ....## ...... Sample Output Case 1: 3 1 #include<stdio.h> 2 #include<string.h> 3 const int MAXN=1000; 4 char map[610][6

过山车 HDU 2063 (二分图匹配裸题)

Problem Description RPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了.可是,过山车的每一排只有两个座位,而且还有条不成文的规矩,就是每个女生必须找个个男生做partner和她同坐.但是,每个女孩都有各自的想法,举个例子把,Rabbit只愿意和XHD或PQK做partner,Grass只愿意和linle或LL做partner,PrincessSnow愿意和水域浪子或伪酷儿做partner.考虑到经费问题,boss刘决定只让找到partner的人去坐过山

Land of Farms HDU - 5556 二分图匹配

Farmer John and his brothers have found a new land. They are so excited and decide to build new farms on the land. The land is a rectangle and consists of N×MN×Mgrids. A farm consists of one or more connected grids. Two grids are adjacent if they sha