HDU 1045 Fire Net(图匹配)
- #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=; i<n; i++)
- {
- if(G[u][i] && !vis[i])
- {
- vis[i] = true;
- if( P[i] == - || Find(P[i]))
- {
- P[i] = u;
- return true;
- }
- }
- }
- return false;
- }
- void MakeMaps()
- {
- m = , n = ;///行标记 和 列标记
- for(int i=; i<N; i++)///第 i 行
- {
- for(int j=; j<N; j++)
- {
- if(maps[i][j] == '.')
- NodeInfo[i][j].x = m;
- if(maps[i][j+] == 'X' || maps[i][j+] == )
- m ++;
- }
- }
- for(int i=; i<N; i++)///第 i 列
- {
- for(int j=; j<N; j++)
- {
- if(maps[j][i] == '.')
- NodeInfo[j][i].y = n;
- if(maps[j+][i] == 'X' || maps[j+][i] == )
- n ++;
- }
- }
- for(int i=; i<N; i++)
- {
- for(int j=; 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, , sizeof(G));
- memset(P, -, sizeof(P));
- memset(maps, , sizeof(maps));
- for(int i=; i<N; i++)
- scanf("%s", maps[i]);
- MakeMaps();
- int ans = ;
- for(int i=; i<m; i++)
- {
- memset(vis, false, sizeof(vis));
- if( Find(i) )
- ans ++;
- }
- printf("%d\n", ans);
- }
- return ;
- }

HDU 1045 Fire Net(图匹配)的更多相关文章
- HDU 1045 Fire Net(行列匹配变形+缩点建图)
题意:n*n的棋盘上放置房子.同一方同一列不能有两个,除非他们之间被墙隔开,这种话. 把原始图分别按行和列缩点 建图:横竖分区.先看每一列.同一列相连的空地同一时候看成一个点,显然这种区域不可以同一时 ...
- hdu 1045 Fire Net(二分匹配 or 暴搜)
Fire Net Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
- hdu 1045 Fire Net 二分图匹配 && HDU-1281-棋盘游戏
题意:任意两个个'车'不能出现在同一行或同一列,当然如果他们中间有墙的话那就没有什么事,问最多能放多少个'车' 代码+注释: 1 //二分图最大匹配问题 2 //难点在建图方面,如果这个图里面一道墙也 ...
- HDOJ(HDU).1045 Fire Net (DFS)
HDOJ(HDU).1045 Fire Net [从零开始DFS(7)] 点我挑战题目 从零开始DFS HDOJ.1342 Lotto [从零开始DFS(0)] - DFS思想与框架/双重DFS HD ...
- HDU 1045 Fire Net 【连通块的压缩 二分图匹配】
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1045 Fire Net Time Limit: 2000/1000 MS (Java/Others) ...
- HDU 1045 Fire Net 二分图建图
HDU 1045 题意: 在一个n*n地图中,有许多可以挡住子弹的墙,问最多可以放几个炮台,使得炮台不会相互损害.炮台会向四面发射子弹. 思路: 把行列分开做,先处理行,把同一行中相互联通的点缩成一个 ...
- HDU 1045(Fire Net)题解
以防万一,题目原文和链接均附在文末.那么先是题目分析: [一句话题意] 给定大小的棋盘中部分格子存在可以阻止互相攻击的墙,问棋盘中可以放置最多多少个可以横纵攻击炮塔. [题目分析] 这题本来在搜索专题 ...
- hdu 1045 Fire Net(最小覆盖点+构图(缩点))
http://acm.hdu.edu.cn/showproblem.php?pid=1045 Fire Net Time Limit:1000MS Memory Limit:32768KB ...
- HDU 1045 Fire Net(dfs,跟8皇后问题很相似)
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1045 Fire Net Time Limit: 2000/1000 MS (Java/Others) ...
- HDU 1045——Fire Net——————【最大匹配、构图、邻接矩阵做法】
Fire Net Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Sta ...
随机推荐
- Win7下Qt5.2中使用OpenGL的glu函数库无法使用的解决方案
最近在Window7使用Qt5.2学习OpenGL时,出现了以OpenGL中glu开头的函数库无法使用的错误,例如: 'gluPerspective' was not declared ...
- Java基础知识强化之IO流笔记08:异常的注意事项
1. 异常注意事项: (1)子类重写父类方法时候,子类的方法必须抛出相同的异常或者父类异常的子类.(父亲坏了,儿子不能比父亲更坏) (2)如果父类抛出多个异常,子类重写父类时候,只能抛出相同的异常或者 ...
- Android(java)学习笔记224:横竖屏切换时Activity的生命周期
1.横竖屏切换的生命周期 默认情况下横竖屏切换,先销毁再创建 2.有的时候,默认情况下的横竖屏切换(先销毁再创建),对应用户体验是不好的,比如是手机游戏横竖屏切换对游戏体验非常不好,下面两种方 ...
- C#解leetcode 18. 4Sum
Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = tar ...
- 从今天开始学习C#啦
此博客为证,在下从今天开始学习C#,并把心得体会记录下来.
- 【开源java游戏框架libgdx专题】-08-中文显示与绘制
libgdx虽然是由美国人Mario Zechner(即BadlogicGames)写的开源引擎,由于Libgdx底层是用OpenGL实现的,所以Libgdx是可以支持中文的,在libgdx中的汉字都 ...
- js正则表达式验证大全
/判断输入内容是否为空 function IsNull(){ var str = document.getElementById('str').value.trim(); ...
- 编写高效SQL最佳实践
编写高效 SQL 语句的最佳实践 秦玮, 高级软件工程师, IBM 王广成, 软件工程师, IBM 王韵婷, 高级软件工程师, IBM 简介: 本文列举了一些在编写 SQL 查询语句时可能导致 DB2 ...
- asp.net Request.ServerVariables[] 读解
获取客户端的IP地址,代码如下: /// <summary> /// 获取客户端IP地址 /// </summary> /// <returns></retu ...
- ExtJs的事件机制Event(学员总结)
一.事件的三种绑定方式 1.HTML/DHTML 在标签中直接增加属性触发事件 [javascript] view plaincopy <script type="text/javas ...