HDU5093 Battle ships (二分图)

题意:给你一个m*n(1<=m,n<=50)的图,其中 ‘#’代表冰山, ‘*’代表海洋, ‘o’代表浮冰。。然后让你尽可能放置最多的船,但是要满足一下规矩:

  1. 船不能放在冰山上;
  2. 船不能放到浮冰上
  3. 两艘船之间除非中间有冰山,否则不能在同一列或同一行。

分析:红果果的二分最大匹配。。。。图也很容易构造。。。把每一行被冰山分隔开来的海洋格子连通块(至少一个格子)作为X点,同样的每一列被冰山分隔开来的海洋格子连通块作为Y点,X点与Y点有边相连当且仅当这两个连通块共用一个海洋格子。然后跑二分最大匹配。。。2500个点,妥妥的。

以好像是官方题解,但过不了,把next数组改成nextt能过c++的,过不不了g++。

#include<stdlib.h>
#include<cmath>
#include<cstring>
#include<iostream>
#include<map>
#include<set>
#include<algorithm>
#include<queue>
#include<vector>
#include<cstdio>
using namespace std;
#define N 205
#define M 50005
int ev[M],nextt[M];
int head[M];
int cnt;
bool vis[M];
int pre[M];
char s[N][N];
int x[N][N],y[N][N];
int pn[2];
void addedge(int u,int v){
    ev[cnt]=v;
    nextt[cnt]=head[u];
    head[u]=cnt++;
    return;
}
int find(int x){
    for(int i=head[x];~i;i=nextt[i]){
        int v=ev[i];
        if(!vis[v]){
            vis[v]=1;
            if(pre[v]==-1||find(pre[v]))
            {
                pre[v]=x;
                return 1;
            }
        }
    }
    return 0;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--){
        int n,m;
        memset(head,-1,sizeof(head));
        cnt=0;
        memset(pre,-1,sizeof(pre));
        memset(x,0,sizeof(x));
        memset(y,0,sizeof(y));
        scanf("%d%d",&n,&m);
        for(int  i=0;i<n;i++)
            scanf("%s",s[i]);
        int num=0;
        for(int i=0;i<n;i++)
        {
            bool flag=0;
            for(int j=0;j<m;j++){
                if(s[i][j]=='*'){
                    if(flag==0)
                        num++;
                    x[i][j]=num;
                    flag=1;
                }
                else if(s[i][j]=='#')
                    flag=0;
            }
        }
        pn[0]=num;
        num=0;
        for(int  i=0;i<m;i++)
        {
            bool flag=0;
            for(int j=0;j<n;j++){
                if(s[j][i]=='*'){
                    if(flag==0) num++;
                    y[j][i]=num;
                    flag=1;
                }
                else if(s[j][i]=='#')
                    flag=0;
            }
        }
        pn[1]=num;
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
        {
            int u = x[i][j],v=y[i][j];
            if(u&&v) addedge(u,v);
        }
        int ans=0;
        for(int i=1;i<=pn[0];++i)
        {
            memset(vis,0,sizeof(vis));
            ans+=find(i);
        }
        printf("%d\n",ans);
    }
    return 0;
}
时间: 2024-11-05 04:46:03

HDU5093 Battle ships (二分图)的相关文章

HDOJ 5093 Battle ships 二分图匹配

二分图匹配: 分别按行和列把图展开,hungary二分图匹配.... 样例: 4 4 *ooo o### **#* ooo* 按行展开.... *ooo o#oo oo#o ooo# **#o ooo* ooo* 再按列展开... 7 * 8 *ooooooo oooooooo oooooooo oooooooo *o*ooooo ooooooo* ooooooo* 匹配结果3 Battle ships Time Limit: 2000/1000 MS (Java/Others)    Memo

Battle ships(二分图,建图,好题)

Battle ships Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 1007    Accepted Submission(s): 353 Problem Description Dear contestant, now you are an excellent navy commander, who is responsible

hdu 5093 Battle ships二分图

二分图最大匹配问题 遇到冰山就把行列拆成两个部分.每个部分x也好,y也好只能匹配一次 图画得比较草,将就着看 横着扫一遍,竖着扫一遍,得到编号 一个位置就对应一个(xi,yi)就是X集到Y集的一条边, 由题意,每个点只能被选择一次.所以最大匹配的边数就是答案了. 算法过程 通常都是先贪心求一个匹配,然后开始增广. 寻找增广路的过程: 一个没有和任意边匹配的点叫做未盖点,从左集X中一个未盖点u出发寻找增广路. 从u出发,选一个非匹配边到达Y集中的v,如果v没匹配,那么就找到一条增广路(只要把之前走

hdu 5093 Battle ships 二分图匹配

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5093 一开始就往贪心的方向想了结果wa全场 这种矩阵形式的图一般要联想到行和列构成了二分图 然后实质就是求一个最大匹配 中间的冰山实际上就是把一行或一列切成多个顶点而已 所以一开始预处理一下 然后就可以套用模板 #include <cstring> #include <cstdlib> #include <cstring> #include <cmath> #i

hdoj 5093 Battle ships 【二分图最大匹配】

题目:hdoj 5093 Battle ships 题意:给你一个n*m的图,图中有冰山 '# ',浮冰 'o' 以及普通海 ' * ',现在要在海中布置尽可能多的炮弹,炮弹不能突波冰山,不能让炮弹互相攻击到,问最大能不知多少个? 分析:二分图的经典题目,关键在于怎么建图,图进行两次编号,按行编号,每一行中能攻击到的一块编号成相同的数,每一列同样,然后对行和列有编号的地方进行连边,求一次最大匹配即可,我用最大流求的最大匹配. AC代码: #include <cstdio> #include &

hdu 5093 Battle ships 最大二分匹配

Battle ships Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 589    Accepted Submission(s): 233 Problem Description Dear contestant, now you are an excellent navy commander, who is responsible

ZOJ3623:Battle Ships(完全背包)

Battle Ships is a new game which is similar to Star Craft. In this game, the enemy builds a defense tower, which has L longevity. The player has a military factory, which can produce N kinds of battle ships. The factory takes tiseconds to produce the

zoj3623 Battle Ships

Battle Ships is a new game which is similar to Star Craft. In this game, the enemy builds a defense tower, which has L longevity. The player has a military factory, which can produce N kinds of battle ships. The factory takes ti seconds to produce th

zoj 3623 Battle Ships dp

 Description Battle Ships is a new game which is similar to Star Craft. In this game, the enemy builds a defense tower, which has L longevity. The player has a military factory, which can produce N kinds of battle ships. The factory takes ti second