( ̄▽ ̄)"

//无向二分图的最小路径覆盖数=顶点总数-最大匹配数/2(最大匹配数=最小点覆盖数)
//这里最大匹配数需要除以2,因为每两个相邻的*连一条边,即<u,v>和<v,u>是一样的,所以结果多了一倍
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std; const int MAXN=405;
int uN;
char G[MAXN][MAXN];
int Hash[MAXN][MAXN];
vector<int> g[MAXN];
int link[MAXN];
bool vis[MAXN]; bool DFS(int u)
{
for(int i=0;i<g[u].size();i++)
{
int v=g[u][i];
if(!vis[v])
{
vis[v]=true;
if(link[v]==-1||DFS(link[v]))
{
link[v]=u;
return true;
}
}
}
return false;
} int hungary()
{
int res=0;
memset(link,-1,sizeof(link)); for(int u=0;u<uN;u++)
{
memset(vis,0,sizeof(vis));
if(DFS(u)) res++;
}
return res;
} int main()
{
int cas,tot;
scanf("%d",&cas);
while(cas--)
{
int h,w;
tot=0;
scanf("%d%d",&h,&w);
for(int i=0;i<h;i++)
{
scanf("%s",G[i]);
for(int j=0;j<w;j++)
{
if(G[i][j]=='*')
Hash[i][j]=tot++; //构建数字图
}
}
memset(g,0,sizeof(g));
for(int i=0;i<h;i++)
for(int j=0;j<w;j++)
if(G[i][j]=='*')
{
if(i>0&&G[i-1][j]=='*')
g[Hash[i][j]].push_back(Hash[i-1][j]);
if(i<h-1&&G[i+1][j]=='*')
g[Hash[i][j]].push_back(Hash[i+1][j]);
if(j>0&&G[i][j-1]=='*')
g[Hash[i][j]].push_back(Hash[i][j-1]);
if(j<w-1&&G[i][j+1]=='*')
g[Hash[i][j]].push_back(Hash[i][j+1]);
}
uN=tot;
printf("%d\n",tot-hungary()/2);
}
return 0;
}

POJ 3020 Antenna Placement(无向二分图的最小路径覆盖)的更多相关文章

  1. POJ 3020:Antenna Placement(无向二分图的最小路径覆盖)

    Antenna Placement Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6334   Accepted: 3125 ...

  2. POJ 3020 Antenna Placement 最大匹配

    Antenna Placement Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6445   Accepted: 3182 ...

  3. poj 3020 Antenna Placement(二分无向图 匈牙利)

    Antenna Placement Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6438   Accepted: 3176 ...

  4. POJ:3020-Antenna Placement(二分图的最小路径覆盖)

    原题传送:http://poj.org/problem?id=3020 Antenna Placement Time Limit: 1000MS Memory Limit: 65536K Descri ...

  5. Antenna Placement(匈牙利算法 ,最少路径覆盖)

    Antenna Placement Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6991   Accepted: 3466 ...

  6. 二分图最大匹配(匈牙利算法) POJ 3020 Antenna Placement

    题目传送门 /* 题意:*的点占据后能顺带占据四个方向的一个*,问最少要占据多少个 匈牙利算法:按坐标奇偶性把*分为两个集合,那么除了匹配的其中一方是顺带占据外,其他都要占据 */ #include ...

  7. POJ 3020 Antenna Placement (二分图最小路径覆盖)

    <题目链接> 题目大意:一个矩形中,有N个城市’*’,现在这n个城市都要覆盖无线,每放置一个基站,至多可以覆盖相邻的两个城市.问至少放置多少个基站才能使得所有的城市都覆盖无线? 解题分析: ...

  8. poj 3020 Antenna Placement (最小路径覆盖)

    链接:poj 3020 题意:一个矩形中,有n个城市'*'.'o'表示空地,如今这n个城市都要覆盖无线,若放置一个基站, 那么它至多能够覆盖本身和相邻的一个城市,求至少放置多少个基站才干使得全部的城市 ...

  9. POJ 1422 Air Raid(二分图匹配最小路径覆盖)

    POJ 1422 Air Raid 题目链接 题意:给定一个有向图,在这个图上的某些点上放伞兵,能够使伞兵能够走到图上全部的点.且每一个点仅仅被一个伞兵走一次.问至少放多少伞兵 思路:二分图的最小路径 ...

随机推荐

  1. 自定义配置文件的使用及加载-txt

    [Game] Version=1 [Login] Account = 阿斗阿斯顿撒 Password =我去饿我去恶趣味 Success = 成哥 Faild = 失败 [Job] Job1 = 战士 ...

  2. IOS数据库操作SQLite3使用详解(转)

    iPhone中支持通过sqlite3来访问iPhone本地的数据库.具体使用方法如下1:添加开发包libsqlite3.0.dylib首先是设置项目文件,在项目中添加iPhone版的sqlite3的数 ...

  3. Base64加密与解密

    import sun.misc.BASE64Decoder;import sun.misc.BASE64Encoder; // 将 str进行 BASE64 编码 public static Stri ...

  4. WPF和Winform的一些界面控件

    DevExpressTelerikMahApps.MetroModern UI for WPFModernWPFExtended WPF Toolkit™ Community EditionModer ...

  5. php中switch语句case后表达式写法记录一

    可作等级评价: $var = 95; switch(true){ case $var < 100; $level = 1; break; case $var < 95; $level = ...

  6. [ An Ac a Day ^_^ ] hdu 2830 矩阵交换II

    第一眼觉得是个dp 但是有了可以随意交换的条件觉得简单了不少 但是还是没做出来…… 看了一下别人的做法才觉得自愧不如 因为所有列都可以随意交换 应该尽量把长的放在一起 那么将所有的矩形排序之后 以第j ...

  7. java基础第二天

    学习了关键字,标识符,数据类型.变量和常量,运算符和表达式,开始编写一些简单的输入输出运算的程序了.

  8. Webdriver其他定位方式

    1.下拉框的定位 在遇到select下拉框的选择时,比如: <select id="nr" name="NR"> <option select ...

  9. QDataStream对QVector的序列化

    最近发现QDataStream这个好东东,序列化发送数据很方便,与大家分享一下. 客户端: line.h #ifndef LINE_H #define LINE_H #include <QStr ...

  10. JavaScript中时间戳和时间的相互转换

    时间转换成时间戳: var time = new Date(); var timestamp=Date.parse(time)   //毫秒数,得到秒除以1000: 时间戳转成时间: 1.转换成 20 ...