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

BZOJ 2150 部落战争(最小路径覆盖)

时间:2014-06-23 06:59:10      阅读:135      评论:0      收藏:0      [点我收藏+]

标签:style   class   blog   http   tar   get   

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2150

题意:一个n*m的国家,有些是障碍。对于一支军队,每次只能走C*R的格式(比如马是走1*2的格式),而且只能从上往下走。每个格子只能被一个军队经过。问最少需要多少军队可以遍历完所有格子?

思路:上下能连边的连边。最后就是最小路径覆盖。

 

int a[N][N],n,m;
char s[55][55];
 
 
int ID(int i,int j)
{
    return (i-1)*m+j;
}
 
int visit[N],match[N];
 
int r,c;
 
int ok(int x,int y)
{
    return x>=1&&x<=n&&y>=1&&y<=m&&s[x][y]==‘.‘;
}
 
int DFS(int u)
{
    int i;
    FOR1(i,n*m) if(a[u][i]&&!visit[i])
    {
        visit[i]=1;
        if(match[i]==-1||DFS(match[i]))
        {
            match[i]=u;
            return 1;
        }
    }
    return 0;
}
 
int main()
{
    RD(n,m); RD(r,c);
    int i,j;
    FOR1(i,n) RD(s[i]+1);
    FOR1(i,n) FOR1(j,m) if(s[i][j]==‘.‘)
    {
        if(ok(i-c,j-r)) a[ID(i-c,j-r)][ID(i,j)]=1;
        if(ok(i-c,j+r)) a[ID(i-c,j+r)][ID(i,j)]=1;
        if(ok(i-r,j-c)) a[ID(i-r,j-c)][ID(i,j)]=1;
        if(ok(i-r,j+c)) a[ID(i-r,j+c)][ID(i,j)]=1;
    }
    clr(match,-1);
    int ans=0,sum=0;
    FOR1(i,n) FOR1(j,m) if(s[i][j]==‘.‘)
    {
        clr(visit,0);
        ans+=DFS(ID(i,j));
        sum++;
    }
    PR(sum-ans);
}

 

 

 

BZOJ 2150 部落战争(最小路径覆盖),布布扣,bubuko.com

BZOJ 2150 部落战争(最小路径覆盖)

标签:style   class   blog   http   tar   get   

原文地址:http://www.cnblogs.com/jianglangcaijin/p/3799606.html

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