棋盘游戏 HDU1281

一开始毫无思路  看了题解才发现是二分图的最大匹配问题

行为n 列为m  行列匹配  (一行只能与一列匹配   这点和象棋的车的意义一样)

再去掉点看看最大匹配会不会少  如果少了说明为关键点

其中  x,y数组值得学习!

#include<bits/stdc++.h>
using namespace std;
#define MAXI 105
int mp[MAXI][MAXI];
int used[MAXI];
int vis[MAXI];
int n,m;
bool dfs(int  x)
{
    for(int j=1;j<=m;j++)
    {
        if(mp[x][j]&&!used[j])
        {
            used[j]=1;
            if(!vis[j]||dfs(vis[j]))
              {
                  vis[j]=x;
                  return true;
              }
        }
    }
    return false;
}

int find1(void)
{    int ans=0;
 memset(vis,0,sizeof(vis));
     for(int i=1;i<=n;i++)
       {
           memset(used,0,sizeof(used));
           if(dfs(i))ans++;
       }
       return ans;
}

int main()
{
   int k;
   int cas=0;
   while(scanf("%d%d%d",&n,&m,&k)==3)
   {
       memset(mp,0,sizeof(mp));
       int x[MAXI*MAXI],y[MAXI*MAXI];
      for(int i=1;i<=k;i++)
      {
          scanf("%d%d",&x[i],&y[i]);
          mp[ x[i] ][ y[i] ]=1;
      }
       int ans=find1();
       int sum=0;
       for(int i=1;i<=k;i++)
       {
           mp[ x[i] ][ y[i] ]=0;
           int a=find1();
           if(a<ans) sum++;
           mp[ x[i] ][ y[i] ]=1;
       }
      printf("Board %d have %d important blanks for %d chessmen.
",++cas,sum,ans);
   }
}

做了1045感觉有点疑惑 

发现这种是   没有障碍的   只是限定哪些格子可以放

而那题有墙这种概念

原文地址:https://www.cnblogs.com/bxd123/p/10364394.html