码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 5093 Battle ships(二分图最大匹配)

时间:2014-11-11 14:15:45      阅读:194      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   ar   os   sp   for   div   on   

题意:

M*N的矩阵,每个格子上是三个之一:*、o、#。                       (1 <= m, n <= 50)

*:海洋,战船可以停在上面。      o:浮冰,战船不可以停在上面      #:冰山,战船不可以停在上面。

限制:两艘战船不能处于同一行或同一列,除非它们之间有冰山挡着。

问最多可以停多少艘战船。

 

思路:

和二分图最小点覆盖那道经典题很相似。不过不是求最小点覆盖。

对于每一行,如果连续的一段只能放一艘战船,则将这一段视为同一个点。则每一行都被分为若干个小段,即若干个点。将这些点作为二分图的左部X集合。

对于每一列,同理。

对于(i,j)若这点可以放一艘战船,则将其对应在X集合中的位置与对应在Y集合中的位置连一条线。(实质上:每一条线代表一个可以放一艘战船的位置)

求二分图的最大匹配即是答案。

 

代码:

int T,m,n;
char mapp[55][55];
char temp[55];
int row[55][55], col[55][55];
int cc1,cc2;
int cx[2505], cy[2505];
bool bmask[2505];
vector<int> graph[2505];


int findPath(int u){
    int L=graph[u].size();
    rep(i,0,L-1){
        int v=graph[u][i];
        if(!bmask[v]){
            bmask[v]=true;
            if(cy[v]==-1||findPath(cy[v])){
                cy[v]=u;
                cx[u]=v;
                return 1;
            }
        }
    }
    return 0;
}
int MaxMatch(){
    int ans=0;
    rep(i,1,cc1) cx[i]=-1;
    rep(i,1,cc2) cy[i]=-1;
    rep(i,1,cc1) if(cx[i]==-1){
        mem(bmask,false);
        ans+=findPath(i);
    }
    return ans;
}


int main(){
    //freopen("test.in","r",stdin);
    cin>>T;
    while(T--){
        scanf("%d%d",&m,&n);
        rep(i,0,m-1) scanf("%s",mapp[i]);
        cc1=0, cc2=0;
        mem(row,0);  mem(col,0);
        rep(i,0,m-1){
            rep(j,0,n-1) temp[j]=mapp[i][j];
            int p=0;
            while(p<n){
                while(p<n&&temp[p]!=*) ++p;
                if(p<n) ++cc1;
                while(p<n&&temp[p]!=#) {row[i][p]=cc1; ++p;}
            }
        }

        rep(j,0,n-1){
            rep(i,0,m-1) temp[i]=mapp[i][j];
            int p=0;
            while(p<m){
                while(p<m&&temp[p]!=*) ++p;
                if(p<m) ++cc2;
                while(p<m&&temp[p]!=#) {col[p][j]=cc2; ++p;}
            }
        }
        rep(i,1,cc1) graph[i].clear();
        rep(i,0,m-1) rep(j,0,n-1) if(mapp[i][j]==*) graph[row[i][j]].push_back(col[i][j]);

        int dd=MaxMatch();
        printf("%d\n",dd);
    }
    //fclose(stdin);
}

 

hdu 5093 Battle ships(二分图最大匹配)

标签:style   blog   color   ar   os   sp   for   div   on   

原文地址:http://www.cnblogs.com/fish7/p/4089196.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!