标签:des style blog http color os io strong
题目链接:http://poj.org/problem?id=3020
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 6692 | Accepted: 3325 |
Description
题意:给定一个地图,*代表城市,o代表空地,用天线来覆盖相邻的两个城市,问最少需要多少天线?(所谓相邻是指上下左右4个方向相邻)
题意很清晰,求二分图的最小路径覆盖,难点还是建图。。。今天运气好,建图的思路来源于ZOJ1654
PS,覆盖的是城市,不是空地,开始我就数错了
思路:刚好今天做了ZOJ 1654,和1654差不多,那个采用分块的思想,而这个是把单个的城市当做一块,进行编号从而构建图的连通性,至于最后的输出结果,城市总数减去最大匹配数==剩余的城市数,也就是最大独立集合数,剩余城市的个数说明他们无法进行增广/匹配,那么就需要单独建设天线,而 匹配数/2 == 一个天线覆盖两个城市
所以最终answer = city - ans + ans/2
| Accepted | 1584K | 16MS | C++ |
想明白后,直接开敲,手残一次,1A
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <math.h>
#define init(a) memset(a,0,sizeof(a))
#define PI acos(-1,0)
using namespace std;
const int maxn = 60;
const int maxm = 600;
#define lson left, m, id<<1
#define rson m+1, right, id<<1|1
#define min(a,b) (a>b)?b:a
#define max(a,b) (a>b)?a:b
int ma[maxn][maxn];
char MAP[maxn][maxn];
int G[maxm][maxm];
int line[maxm];
bool vis[maxm];
int mv[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};
int n,m,city;
int DFS(int u)
{
for(int v = 1;v<=city;v++)
{
if(G[u][v]==1 && !vis[v])
{
vis[v] = 1;
if(line[v]==-1 || DFS(line[v]))
{
line[v] = u;
return 1;
}
}
}
return 0;
}
int K_M()
{
int ans = 0;
memset(line,-1,sizeof(line));
for(int i = 1;i<=city;i++)
{
init(vis);
ans += DFS(i);
}
return ans;
}
void Get_G(int i,int j)//构图
{
for(int dir = 0;dir<4;dir++)
{
int wx = i + mv[dir][0];
int wy = j + mv[dir][1];
if(MAP[wx][wy]=='*')
{
G[ma[i][j]][ma[wx][wy]] = 1;//构建当前城市与它4个方向相邻的城市连通
}
}
}
int main()
{
int t;
scanf("%d",&t);
char a[500];
while(t--)
{
scanf("%d%d",&n,&m);
city = 0;
gets(a);//不加,测试数据就读不进。。。。。我特别无语
init(ma); init(G);
for(int i = 0;i<n;i++)
{
gets(MAP[i]);
for(int j = 0;j<m;j++)
{
if(MAP[i][j]=='*')
ma[i][j] = ++city;//给所有城市编号
}
}
for(int i = 0;i<n;i++)
{
for(int j = 0;j<m;j++)
{
if(MAP[i][j]=='*')
{
Get_G(i,j);//构建二分图
}
}
}
int ans = K_M();
// printf("cisy = %d ans = %d\n",city,ans);
//一个匹配相当于一个点被覆盖
printf("%d\n",city-ans+ans/2);
}
return 0;
}
POJ 3020 Antenna Placement(二分图建图训练 + 最小路径覆盖),布布扣,bubuko.com
POJ 3020 Antenna Placement(二分图建图训练 + 最小路径覆盖)
标签:des style blog http color os io strong
原文地址:http://blog.csdn.net/wjw0130/article/details/38642025