zoj1654二分图

  题意:输入一个地图,*是草坪 # 是墙 o是空地。机器人只能放在空地上,且两个同行或者同列的机器人中间必须有墙,问最多可以放多少个机器人。

书上给出:......将行视为x    , 列视为 y. 求 x 与 y 这个2分图之间的最大匹配。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <climits>
#include <string>
#include <iostream>
#include <map>
#include <cstdlib>
#include <list>
#include <set>
#include <queue>
#include <stack>
#include<math.h>
using namespace std;
int numx;int numy;
const int maxn=51;
int link[maxn*maxn];
int xx[maxn*maxn],yy[maxn*maxn];
int x[maxn][maxn];
int y[maxn][maxn];
int used[maxn*maxn];
int g[maxn*maxn][maxn*maxn];
int dfs(int x)
{
    for(int i=1;i<=numy;i++){
        if(g[x][i]&&!used[i]){
            used[i]=1;
            if(link[i]==-1||dfs(link[i])){
                link[i]=x;
                return 1;
            }
        }
    }
    return 0;
}

void solve()
{
    int ans=0;
    for(int i=1;i<=numx;i++){
        memset(used,0,sizeof(used));
        if(dfs(i)) ans++;
    }
    cout<<ans<<endl;
}
int main()
{
    char str[maxn][maxn];
    int Icase;
    int n,m;
    scanf("%d",&Icase);
    int k=0;
    while(Icase--){
        memset(link,-1,sizeof(link));
        k++;
        memset(x,0,sizeof(x));
        memset(y,0,sizeof(y));
        memset(g,0,sizeof(g));
        scanf("%d%d",&m,&n);
        for(int i=0;i<m;i++)
            scanf("%s",str[i]);
        numx=0;numy=0;
        for(int i=0;i<m;i++){
            int flag=0;
            for(int j=0;j<n;j++){
                if(str[i][j]==‘o‘){
                    if(!flag) numx++;
                    x[i][j]=numx;flag=1;
                }
                else if(str[i][j]==‘#‘) flag=0;
            }
        }
        for(int j=0;j<n;j++){
            int flag=0;
            for(int i=0;i<m;i++){
                if(str[i][j]==‘o‘){
                    if(!flag) numy++;
                    y[i][j]=numy;flag=1;
                }
                else if(str[i][j]==‘#‘) flag=0;
            }
        }
        for(int i=0;i<m;i++)
            for(int j=0;j<n;j++)
            if(x[i][j]) g[x[i][j]][y[i][j]]=1;
        printf("Case :%d\n",k);
        solve();
    }
    return 0;
}

zoj1654二分图

时间: 2024-08-10 23:22:00

zoj1654二分图的相关文章

ZOJ1654 Place the Robots(二分图最大匹配)

二分图最大匹配也叫二分图最大边独立数,就是二分图中最多能取出两两不相邻的边的数目. 如果题目没有墙,那就是一道经典的二分图最大匹配问题: 把地图上的行和列分别作为点的X部和Y部,地图上每一块空地看作边,边的两个端点就是它所在的x行y列.这样,求最大边独立集即可. 而这一题有墙,然后我不会了.. 其实这题的建模也是一样的,也是行和列作为点,空地作为边: 对于每一行把被墙分隔的每一块连通的区域缩成一点,列也一样: 行缩成的点作为X部,列Y部: 某行连通区域最多就只能在区域内某一块空地放机器人,列也是

POJ 3020 Antenna Placement(二分图建图训练 + 最小路径覆盖)

题目链接:http://poj.org/problem?id=3020 Antenna Placement Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6692   Accepted: 3325 Description The Global Aerial Research Centre has been allotted the task of building the fifth generation of mobi

bzoj4025 二分图

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4025 [题解] 考虑对时间分治,用可撤回的启发式合并并查集来维护连通性. 二分图的条件是没有奇环,用并查集判即可. 对于时间区间[l,r],如果边在这期间都存在,那么就加入并查集,对于剩下的边分类,并且分治下去做. 对于每条边,在log个区间表示出来了,需要进行判断,启发式合并的getf是log的,所以复杂度为O(nlog^2n) # include <stdio.h> # includ

POJ2584 T-Shirt Gumbo 二分图匹配(网络流)

1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 5 const int inf=0x3f3f3f3f; 6 const int sink=30; 7 8 struct Edge 9 { 10 int to; 11 int next; 12 int capacity; 13 14 void assign(int t,int n,int c) 15 { 16 to=t; next=n; ca

棋盘游戏(二分图匹配)

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1281 棋盘游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 3200    Accepted Submission(s): 1897 Problem Description 小 希和Gardon在玩一个游戏:对一个N*M的棋盘,在格子里放

二分图【模板】

二分图:原图G的顶点可以分类两个集合X和Y,所有的边关联的两个顶点恰好一个属于集合X,另一个属于集合Y,则称该图为二分图. 二分图匹配:给定一个二分图G,在G的一个子图M中,M的边集中的任意两条边都不依附于同一个顶点,即一个顶点最多只有一条边.则称M是一个匹配. 二分图最大匹配:图中包含边数最多的匹配称为图的最大匹配. 二分图完美匹配:如果所有点都在匹配边上,则称这个最大匹配是完美匹配. 二分图多重匹配:二分图匹配一对一匹配,这里允许集合Y中的一个元素和集合X中的多个元素匹配(一般有最大限制N)

NYOJ 237 游戏高手的烦恼 &amp;&amp; POJ3041-Asteroids ( 二分图的最大匹配 )

链接: NYOJ 237  游戏高手的烦恼:click here~~ POJ  3041 Asteroids           :click here~~ 题意: 两题一样,翻译不同而已. 有一位传说级游戏高手,在闲暇时间里玩起了一个小游戏,游戏中,一个n*n的方块形区域里有许多敌人,玩家可以使用炸弹炸掉某一行或者某一列的所有敌人.他是种玩什么游戏都想玩得很优秀的人,所以,他决定,使用尽可能少的炸弹炸掉所有的敌人. 现在给你一个游戏的状态,请你帮助他判断最少需要多少个炸弹才能炸掉所有的敌人吧.

POJ1325 Machine Schedule 【二分图最小顶点覆盖】

Machine Schedule Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 11958   Accepted: 5094 Description As we all know, machine scheduling is a very classical problem in computer science and has been studied for a very long history. Scheduli

HDU 1045 Fire Net 二分图Bipartite题解

本题可以使用DFS直接爆搜出答案,不过这样类型的题目其实是个二分图的题解. 这个二分图,难不在Hungary算法,而是难在于建图.需要挺高的抽象思维的. 建图: 1 把同一行不被X分开的格子标同一个号码,被X分开的标下一个号码,这样做是为了缩点,不需要把所有的格子都分开标号,而且可以更方便建个更加小的图. 2 同理把同一列的格子标号 3 然后判断相同一个格子的行标号和列标号是有路径的,其他不在同一个格子的都是没有路径的. 4 这样就等于以行标号和列标号作为左右顶点,构建成一个二分图了 然后使用H