HDU 1045 Fire Net(图匹配)

题目大意:

这个是以前做过的一道DFS题目,当时是完全暴力写的。

给你一个N代表是N*N的矩阵,矩阵内 ‘X’代表墙, ‘.’代表通道。

问这个矩阵内最多可以放几个碉堡, 碉堡不能在同一行或者同一列,除非他们中间有墙。

二分图做法思想:我们用行去匹配列,判断最大匹配数。

我们需要重新构图, 假如一行中 (  ..X..X.. ) 那么在这一行中我们其实是可以分割到三个不同的行(因为中间隔有X)。然后对这个三个行进行编号。同理列也是一样的。当我们完全构好图后就可以做完全匹配了,其他的跟HDU 1083 Courses(最大匹配模版题) 差不多。

吐槽一下杭电,代码写好了提交用C++WA  G++过 妈蛋

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
#define maxn 50
bool G[maxn][maxn];///重新构图存储
bool vis[maxn];///标记点是否被遍历过
char maps[maxn][maxn];///地图存储
int P[maxn];///第 i  行匹配的第 P[i]列
int n, m, N;///重构图后是m行 n列
struct Node
{
    int x, y;
}NodeInfo[maxn][maxn];///保存每个点重构图后所在的行和列

bool Find(int u)
{
    for(int i=0; i<n; i++)
    {
       if(G[u][i] && !vis[i])
       {
           vis[i] = true;
           if( P[i] == -1 || Find(P[i]))
           {
               P[i] = u;
               return true;
           }
       }
    }
    return false;
}
void MakeMaps()
{
    m = 0, n = 0;///行标记 和 列标记

    for(int i=0; i<N; i++)///第 i 行
    {
        for(int j=0; j<N; j++)
        {
            if(maps[i][j] == ‘.‘)
                NodeInfo[i][j].x = m;
            if(maps[i][j+1] == ‘X‘ || maps[i][j+1] == 0)
                m ++;
        }
    }

    for(int i=0; i<N; i++)///第 i 列
    {
        for(int j=0; j<N; j++)
        {
            if(maps[j][i] == ‘.‘)
                NodeInfo[j][i].y = n;
            if(maps[j+1][i] == ‘X‘ || maps[j+1][i] == 0)
                n ++;
        }
    }

    for(int i=0; i<N; i++)
    {
        for(int j=0; j<N; j++)
        {
            int x = NodeInfo[i][j].x;
            int y = NodeInfo[i][j].y;

            if(maps[i][j] == ‘.‘)
                G[x][y] = true;
        }
    }
}

int main()
{
    while(scanf("%d", &N), N)
    {

        memset(G, 0, sizeof(G));
        memset(P, -1, sizeof(P));
        memset(maps, 0, sizeof(maps));

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

        MakeMaps();
        int ans = 0;
        for(int i=0; i<m; i++)
        {
            memset(vis, false, sizeof(vis));
            if( Find(i) )
                ans ++;
        }
        printf("%d\n", ans);
    }
    return 0;
}

时间: 2024-10-19 19:39:30

HDU 1045 Fire Net(图匹配)的相关文章

HDU 1045 Fire Net (二分匹配)

Fire Net Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Description Suppose that we have a square city with straight streets. A map of a city is a square board with n rows and n columns, each representing a street

HDU 1045 - Fire Net (最大独立集)

题意:给你一个正方形棋盘.每个棋子可以直线攻击,除非隔着石头.现在要求所有棋子都不互相攻击,问最多可以放多少个棋子. 这个题可以用搜索来做.每个棋子考虑放与不放两种情况,然后再判断是否能互相攻击来剪枝.最后取可以放置的最大值. 这里我转化成求最大独立集来做. 首先将每个空地编号,对于每个空地,与该位置可以攻击到的空地连边.找最多的空地使得不互相攻击,即求该图的最大独立集.与搜索做法基本一致,但是说法略有不同. 1 #include<iostream> 2 #include<cstring

HDU 1045 Fire Net 贪心

Problem Description Suppose that we have a square city with straight streets. A map of a city is a square board with n rows and n columns, each representing a street or a piece of wall. A blockhouse is a small castle that has four openings through wh

hdu 1045 Fire Net(最小覆盖点+构图(缩点))

http://acm.hdu.edu.cn/showproblem.php?pid=1045 Fire Net Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1045 Description Suppose that we have a square city with straight streets. A map of a city

HDU 1045 Fire Net 状压暴力

原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1045 Fire Net Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 8073    Accepted Submission(s): 4626 Problem Description Suppose that we have a squar

HDU 1045——Fire Net——————【最大匹配、构图、邻接矩阵做法】

Fire Net Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1045 Description Suppose that we have a square city with straight streets. A map of a city is a square board with n rows and n columns, e

HDU 1045 Fire Net(dfs,跟8皇后问题很相似)

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1045 Fire Net Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 14670    Accepted Submission(s): 8861 Problem Description Suppose that we have a squar

HDU - 1045 Fire Net(二分匹配)

Description Suppose that we have a square city with straight streets. A map of a city is a square board with n rows and n columns, each representing a street or a piece of wall. A blockhouse is a small castle that has four openings through which to s

HDU - 1045 Fire Net (dfs 或 二分图)

题意:给出一个不会超过4x4的mapmap中有墙,以及空白处.然后你要在空白处放置尽可能多的炮台炮台对向四周发射子弹,即(炮台不能放在同一行或者列除非有强阻挡)思路:首先想到了dfs枚举(就像八皇后一样回溯法),我们尽可能多的在一行一行的放置.关于放置搜索的问题,我们判断是否合法关于二分图匹配(完全没有想出来怎么匹配..)在网上看了别人的题解才懂由于同行或者同列不能多个放置(即每行每列只能放一个除了有墙挡)然后就是建图:将每行每列连续的部分缩成一个点如图:(画的真的丑...) 我们然后这就有连接