hdu 5093 二分匹配

/*
题意:给你一些冰岛。公共海域和浮冰,冰岛可以隔开两个公共海域,浮冰无影响
求选尽可能多的选一些公共海域点每行每列仅能选一个。
限制条件:冰山可以隔开这个限制条件。即*#*可以选两个
预处理:
*****
**#*#
*****   可以按行转化  

*****
**#oo
ooo*#
*****

按列转化
***o**o
**ooooo
oooo*oo
**o**o*
因为每行每列顶多可以增加50
所以总共最多2500*2500的矩阵
然后直接二分匹配即可
*/
#include<stdio.h>
#include<string.h>
#define N  2800
int ma[N][N];
char s[60][60];
int ans[N][N];
int n,m,addx,addy;
void slovex() {//按行转化
  int i,k;
  addx=0;
for(i=1;i<=n;i++) {
addx++;
 //printf("%d\n",addx);
 k=1;
while(1) {
    for(;s[i][k]!='#'&&k<=m;k++) {
      if(s[i][k]=='*')
       ans[addx][k]=1;
    }
    if(k==m)
        ans[addx][k]=2;
    if(k==m+1||k==m)
        break;
    ans[addx][k]=2;
    k++;
    addx++;
}
}
return ;
}
void slovey() {//在按行转化的基础上按列转化
 int i,k;
 addy=0;
 for(i=1;i<=m;i++) {
    addy++;
    k=1;
 //   printf("%d\n",addy);
    while(1) {
        for(;ans[k][i]!=2&&k<=addx;k++) {
            if(ans[k][i]==1)
                ma[k][addy]=1;
        }
        if(k==addx+1||k==addx)
            break;
            k++;
        addy++;
    }
 }
 return;
}
int vis[N],link[N];
int findd(int u) {
int i;
for(i=1;i<=addy;i++)
if(ma[u][i]&&vis[i]==0) {
vis[i]=1;
if(link[i]==-1||findd(link[i])) {
link[i]=u;
return 1;
}
}
return 0;
}
int main() {
    int t,i,sum,j;
    scanf("%d",&t);
    while(t--) {
        scanf("%d%d",&n,&m);
        memset(ma,0,sizeof(ma));
        memset(ans,0,sizeof(ans));
        for(i=1;i<=n;i++)
            scanf("%s",s[i]+1);
        slovex();
       /*     for(i=1;i<=addx;i++) {
                for(j=1;j<=m;j++)
            printf("%d ",ans[i][j]);
            printf("\n");
        }*/
        slovey();
      /*   for(i=1;i<=addx;i++) {
                for(j=1;j<=addy;j++)
            printf("%d ",ma[i][j]);
            printf("\n");
        }*/
        memset(link,-1,sizeof(link));
        sum=0;
        for(i=1;i<=addx;i++) {//直接套模板二分匹配即可
            memset(vis,0,sizeof(vis));
            sum+=findd(i);
        }
    printf("%d\n",sum);
    }
return 0;}

时间: 2024-10-10 08:26:05

hdu 5093 二分匹配的相关文章

Battle ships HDU - 5093二分匹配

Battle shipsHDU - 5093 题目大意:n*m的地图,*代表海洋,#代表冰山,o代表浮冰,海洋上可以放置船舰,但是每一行每一列只能有一个船舰(类似象棋的車),除非同行或者同列的船舰中间有冰山挡着,问最多能放多少个船舰? 之前做过一个放置炮的,那时数据小直接暴力加搜索就A了,然而这题暴力搜索的话,直接了当的TLE,没办法只好去学新东西了.二分图这个概念只有在之前的题目中做过匈牙利的板子题,可是具体概念和思路并不了解,这题也正好提醒了我去深入了解.但最近需要做的事情较大,一直想整理的

Hdu 2389 二分匹配

题目链接 Rain on your Parade Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 655350/165535 K (Java/Others)Total Submission(s): 2644    Accepted Submission(s): 823 Problem Description You’re giving a party in the garden of your villa by the sea. T

HDU 5093 二分最大匹配

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

hdu 4169 二分匹配最大独立集 ***

题意:有水平N张牌,竖直M张牌,同一方向的牌不会相交.水平的和垂直的可能会相交,求最少踢出去几张牌使剩下的牌都不相交. 二分匹配 最小点覆盖=最大匹配. 链接:点我 坐标点作为匹配的端点 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #incl

hdu 4685 二分匹配+强连通分量

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4685 题解: 1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<vector> 5 #include<stack> 6 #include<algorithm> 7 using namespace std; 8 9 const int maxn =

HDU 3729 二分匹配匈牙利算法

I'm Telling the Truth Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1482    Accepted Submission(s): 740 Problem Description After this year’s college-entrance exam, the teacher did a survey in

H - Prince and Princess - HDU 4685(二分匹配+强连通分量)

题意:有N个王子M个公主,王子喜欢一些公主,而且只能是王子喜欢的人,他们才可以结婚,现在让他们尽可能多的结婚的前提下找出来每个王子都可以和谁结婚. 分析:先求出来他们的最大匹配,因为给的数据未必是完备匹配,所以需要添加一些点使他们成为完备匹配才能求出来的环是完整的,比如第二组数据: 1 2   2 1 2 如果不添加虚拟点做成匹配,只会匹配成功一个,这样就找不出来环了,所以需要添加虚拟的王子和公主,虚拟的王子喜欢所有的公主,虚拟的公主被所有的王子喜欢,注意都是王子喜欢公主的,公主没有选择喜欢的权

HDU 5090 二分匹配

Game with Pearls Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 172    Accepted Submission(s): 103 Problem Description Tom and Jerry are playing a game with tubes and pearls. The rule of the g

Treasure Hunting (hdu 3468 二分匹配+bfs最短路径)

Treasure Hunting Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) Total Submission(s): 1509    Accepted Submission(s): 393 Problem Description Do you like treasure hunting? Today, with one of his friend, iSea is on