hdu4859 海岸线

版权声明:本文为一名蒟蒻的原创文章,大神转载的话顺便说个出处呗。 https://blog.csdn.net/cgh_Andy/article/details/51815480

这其实是一道挺明显的最小割题目。所以就不多说了,推荐一下orz 硕的博客可以看。点击打开链接

然后就不多说了,主要是想冒个泡,太久没写,要好好努力啊。。。

贴个代码:

#include
#include
#include
#include
#include
#include
#include
#include
#define Max 0x7fffffff
#define me(a,x) memset(a,x,sizeof a)
#define cp(a,x) memcpy(a,x,sizeof a)
using namespace std;
typedef long long LL;
const int dx[4]={1,-1,0,0};
const int dy[4]={0,0,1,-1};
struct node
{
    int x,y,c,next;
}a[1010000]; int len,first[3010];
void ins(int x,int y,int c)
{
    a[++len].x=x,a[len].y=y,a[len].c=c;
    a[len].next=first[x],first[x]=len;
    a[++len].x=y,a[len].y=x,a[len].c=0;
    a[len].next=first[y],first[y]=len;
}
queueq;
int h[3010],t;
bool spfa()
{
    for(int i=0;i<=t;i++)h[i]=0;
    h[0]=1; q.push(0);
    while(!q.empty())
    {
        int x=q.front();
        q.pop();
        for(int k=first[x];k;k=a[k].next)
        {
            int y=a[k].y;
            if(!h[y] && a[k].c)
            {
                h[y]=h[x]+1; q.push(y);
            }
        }
    }
    return h[t]>0;
}
int dfs(int x,int f)
{
    if(x==t)return f;
    int de=0;
    for(int k=first[x];k;k=a[k].next)
    {
        int y=a[k].y;
        if(a[k].c && h[y]==h[x]+1)
        {
            int mf=dfs(y,min(a[k].c,f-de));
            a[k].c-=mf,a[k^1].c+=mf,de+=mf;
            if(de==f)return f;
        }
    }
    if(!de)h[x]=0;
    return de;
}
char c[50][50];
int main()
{
    int T,n,m,i,j,k,p;
    scanf("%d",&T);
    for(p=1;p<=T;p++)
    {
        scanf("%d%d",&n,&m);
        for(i=1;i<=n;i++)
          scanf("%s",c[i]+1);
        for(i=1;i<=n;i++)c[i][0]=c[i][m+1]='D';
        for(i=1;i<=m;i++)c[0][i]=c[n+1][i]='D';
        len=1; me(first,0);
        int s=0; t=n*m+1;
        for(i=1;i<=n;i++)
          for(j=1;j<=m;j++)
          {
              int u=m*(i-1)+j;
              if(c[i][j]=='.' || c[i][j]=='D')
              {
                for(k=0;k<4;k++)
                {
                   int xx=i+dx[k],yy=j+dy[k];
                   if(c[i][j]==c[xx][yy])
                   {
                      s++;
                      if(xx<1 || yy<1 || xx>n || yy>m)s++;
                   }
                }
                continue;
              }
              int x1=0,x2=0;
              for(k=0;k<4;k++)
                {
                   int xx=i+dx[k],yy=j+dy[k],uu=m*(xx-1)+yy;
                   if(c[xx][yy]=='.')x1++;
                   else if(c[xx][yy]=='D')x2++;
                   else ins(u,uu,1);
                }
              if( (i+j)&1 ){ins(0,u,x1); ins(u,t,x2);}
              else {ins(0,u,x2); ins(u,t,x1);}
          }
        s/=2;
        while(spfa())s+=dfs(0,Max);
        printf("Case %d: %d\n",p,n*(m+1)+m*(n+1)-s);
    }
    return 0;
}

展开阅读全文

没有更多推荐了,返回首页