zoukankan      html  css  js  c++  java
  • hoj 3069 Little Pigs and Wolves 最大匹配

    /*

     

    题目:

           当狼与猪相邻时,狼要吃猪,若狼吃掉一头猪,他不会再吃另一头猪,问狼可以吃掉的猪的最大数目

     

    分析:

           狼与猪构成二分图,第i头狼能吃掉第j头猪,则g[i][j] = true即可建图,可以先预处理每一头猪和狼

           的序号,然后再建图

     

    */

    #include <cstdio>

    #include <cstring>

    #define X 105

    #define M 11

    char ch[M][M];

    int ym[X],cal[2][M][M],n,m,nw,np;

    //int xm[X];

    bool use[X],g[X][X];

    bool dfs(int u)

    {

           for(int v=1;v<=np;v++)

                  if(g[u][v]&&!use[v])

                  {

                         use[v] = true;

                         if(ym[v]==-1||dfs(ym[v]))

                         {

                                //xm[u] = v;

                                ym[v] = u;

                                return true;

                         }

                  }

                  return false;

    }

    int hungry()

    {

           //memset(xm,-1,sizeof(xm));

           memset(ym,-1,sizeof(ym));

           int ret = 0;

           for(int u=1;u<=nw;u++)

                  //if(xm[u]==-1)

                  {

                         memset(use,false,sizeof(use));

                         if(dfs(u))

                                ret++;

                  }

           return ret;

    }

    int main()

    {

           freopen("sum.in","r",stdin);

           freopen("sum.out","w",stdout);

           while(scanf("%d%d",&n,&m)!=EOF)

           {

                  memset(g,false,sizeof(g));

                  memset(cal,0,sizeof(cal));

                  for(int i=0;i<n;i++)

                         scanf("%s",ch[i]);

                  nw = np = 0;

                  for(int i=0;i<n;i++)

                  {

                         for(int j=0;j<m;j++)

                                if(ch[i][j]=='W')   //表示这个位置为狼,则给它付号为第++nw

                                       cal[1][i][j] = ++nw;

                                else if(ch[i][j]=='P')

                                       cal[0][i][j] = ++np;

                  }

                  for(int i=0;i<n;i++)

                  {

                         for(int j=0;j<m;j++)

                                if(ch[i][j]=='W')

                                       if(i>0&&ch[i-1][j]=='P')           //上面为猪的话

                                              g[cal[1][i][j]][cal[0][i-1][j]] = true;

                                       else if(i<n-1&&ch[i+1][j]=='P')      //

                                              g[cal[1][i][j]][cal[0][i+1][j]] = true;

                                       else if(j>0&&ch[i][j-1]=='P')    //

                                              g[cal[1][i][j]][cal[0][i][j-1]] = true;

                                       else if(j<m-1&&ch[i][j+1]=='P')     //

                                              g[cal[1][i][j]][cal[0][i][j+1]] = true;

                  }

                  printf("%d\n",hungry());

           }

     

           return 0;

    }

  • 相关阅读:
    编写一个函数,接受三个string参数,s,oldVal和newVal。使用迭代器及insert和erase函数将s中所有oldVal替换为newVal。测试你的程序,用他替换通用的简写形式,如,将“tho”,将“”“”
    输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
    oracle中 connect by prior 递归算法
    Java实现3DES加密--及ANSI X9.8 Format标准 PIN PAN获取PIN BlOCK
    XML预览
    Javascript跳转页面和打开新窗口等方法
    Eclipse读取含有extjs的项目文件时卡死或者编写ExtJS时卡
    Oracle-更新字段-一张表的字段更新另一张的表的字段
    Oracle-表被锁住
    03_Ext_Viewport_Window_Dialog
  • 原文地址:https://www.cnblogs.com/yejinru/p/2436089.html
Copyright © 2011-2022 走看看