poj 3020 Antenna Placement 二分匹配

原创 2015年11月20日 20:22:28
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
const int MAXN=601*601+10;
const int MAXM=601*601*2;
struct Edge
{
    int to,next;
} edge[MAXM];
int head[MAXN],tot,mx[MAXN],cx[MAXN],cy[MAXN],mk[MAXN];

void addedge(int from,int to)
{
    edge[tot].to=to;
    edge[tot].next=head[from];
    head[from]=tot++;
}

void init()
{
    memset(head,0xff,sizeof(head));
    tot=0;
}

int dfs(int u)
{
    for(int i=head[u]; i!=-1; i=edge[i].next)
    {
        int v=edge[i].to;
        if(!mk[v])
        {
            mk[v]=1;
            if(cy[v]==-1||dfs(cy[v]))
            {
                cx[u]=v;
                cy[v]=u;
                return 1;
            }
        }
    }
    return 0;
}

int Maxmatch(int n)
{
    int res=0;
    memset(cx,0xff,sizeof(cx));
    memset(cy,0xff,sizeof(cy));
    for(int i=1; i<=n; i++)
    {
        if(cx[i]==-1)
        {
            memset(mk,0,sizeof(mk));
            res+=dfs(i);
        }
    }
    return res;
}

int main()
{
    int _,n,m,i,j,k,u,v,g[50][50],num;
    char mp[50][50];
    scanf("%d",&_);
    while(_--)
    {
        scanf("%d%d",&n,&m);
        init();
        num=0;
        for(i=0;i<n;i++)
            scanf("%s",mp[i]);
        for(i=0;i<n;i++)
            for(j=0;j<m;j++)
                if(mp[i][j]=='*') g[i][j]=++num;

        for(i=0;i<n;i++)
            for(j=0;j<m;j++)
        {
            if(mp[i][j]!='*') continue;
            if(mp[i+1][j]=='*'&&i+1<n)
            {
                addedge(g[i+1][j],g[i][j]);
                addedge(g[i][j],g[i+1][j]);
            }
             if(mp[i][j+1]=='*'&&j+1<m)
            {
                addedge(g[i][j+1],g[i][j]);
                addedge(g[i][j],g[i][j+1]);
            }
        }
        printf("%d\n",num-Maxmatch(num)/2);
    }
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。http://www.xiang578.com

HDU 3020 Antenna Placement(二分图匹配)

解题思路: 相邻的城市连边。 #include #include #include #include #include #include #include #include #in...
  • u013967323
  • u013967323
  • 2015年03月31日 11:51
  • 411

POJ 3020 Antenna Placement 二分匹配

二分图匹配问题。 一开始想不到怎么建图,参考了别人的代码之后才写出来  = - =  #include #include #include #include #include #in...
  • kdqzzxxcc
  • kdqzzxxcc
  • 2012年07月05日 11:20
  • 448

POJ 3020 Antenna Placement (二分匹配)

这道题要求对二分匹配有一个比较详细的了解!同时还要动一点小小的脑筋! 和hdu4185是一个建图思想,然后不一样的是,4185里面不要求覆盖所有的点,但是这个题目是要求覆盖所有的点,用少的椭圆! ...
  • AClion
  • AClion
  • 2013年05月06日 21:55
  • 790

POJ 3020 Antenna Placement

Antenna Placement Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6688 ...
  • lucky_vikey
  • lucky_vikey
  • 2014年08月16日 19:28
  • 305

poj 3020 Antenna Placement

二分匹配基础,只要将a,b找出来就好 对于每个“ *”的4个方向进行查找并且记录他们间的关系; 因为我们对a->b和b->a都进行了读取,所以要除2; #include #include char s...
  • asuxiexie
  • asuxiexie
  • 2014年07月15日 16:01
  • 579

Poj 3020 Antenna Placement

最小路径覆盖
  • scorpiocj
  • scorpiocj
  • 2011年03月11日 14:59
  • 317

【POJ 3020】Antenna Placement

【POJ 3020】Antenna Placement 二分图的最大独立集问题
  • ChallengerRumble
  • ChallengerRumble
  • 2015年07月29日 08:19
  • 1021

poj——3020——Antenna Placement

Description The Global Aerial Research Centre has been allotted the task of building the fifth gener...
  • u011470356
  • u011470356
  • 2014年02月09日 14:45
  • 379

POJ 3020 Antenna Placement【二分匹配——最小路径覆盖】

链接: http://poj.org/problem?id=3020 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=220...
  • Cfreezhan
  • Cfreezhan
  • 2013年08月03日 10:30
  • 1751

ACM POJ 3020 Antenna Placement 二分匹配

题目链接:http://poj.org/problem?id=3020 题意:相邻两个点可以圈起来,问图中所有的'*'点都被圈起来需要的最小的圈的个数。 分析:1.建二分图;             ...
  • u010165025
  • u010165025
  • 2013年09月25日 22:18
  • 433
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:poj 3020 Antenna Placement 二分匹配
举报原因:
原因补充:

(最多只允许输入30个字)