zoukankan      html  css  js  c++  java
  • hdu1281 棋盘游戏 --- 最大匹配

    给一个矩形棋盘,上面有一些空格点,能够放象棋中的“车”,

    现给出空格的坐标,求最多能够放多少个“车”使他们互不攻击(依据象棋规则,每行每列至多仅仅能放一个),

    还要求有几个“车”是必须选择的。


    由于每行每列仅仅能放一个。所以不能有冲突的x或y坐标。既把x和y分为二分图的两个集合。要求最大匹配。

    至于有多少个必须选择的。我们能够枚举最大匹配中的每一个匹配,(一个匹配相当于一个坐标嘛),去掉该匹配之后再求一边最大匹配比較就可以。

    这里我为了方便写。直接枚举了全部给出的点。

    。事实上把最大匹配中的匹配存下来。枚举应该更好一点把


    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<iostream>
    #include<algorithm>
    #include<vector>
    #include<queue>
    #include<map>
    const int maxn=105;
    using namespace std;
    
    int mx[maxn],my[maxn],vis[maxn],e[maxn][maxn],nx,ny;
    
    int path(int i)
    {
        int j;
        for(j=1;j<=ny;j++)
        {
            if(e[i][j]&&!vis[j])
            {
                vis[j]=1;
                if(my[j]==-1||path(my[j]))
                {
                    my[j]=i;
                    mx[i]=j;
                    return 1;
                }
            }
        }
        return 0;
    }
    
    int hungry()
    {
        int res=0;
        memset(mx,-1,sizeof mx);
        memset(my,-1,sizeof my);
        for(int i=1;i<=nx;i++)
        {
            if(mx[i]==-1)
            {
                memset(vis,0,sizeof vis);
                res+=path(i);
            }
        }
        return res;
    }
    
    int main()
    {
        int k,a,b,i,j,cnt,ans,T=1;
        while(~scanf("%d%d%d",&nx,&ny,&k))
        {
            memset(e,0,sizeof e);
            while(k--)
            {
                scanf("%d%d",&a,&b);
                e[a][b]=1;
            }
            ans=hungry();
            cnt=0;
            for(i=1;i<=nx;i++)
            {
                for(j=1;j<=ny;j++)
                {
                    if(e[i][j])
                    {
                        e[i][j]=0;
                        if(hungry()<ans) cnt++;
                        e[i][j]=1;
                    }
                }
            }
            printf("Board %d have %d important blanks for %d chessmen.
    ",T++,cnt,ans);
        }
        return 0;
    }
    


  • 相关阅读:
    显示游标的属性
    显示游标的处理
    5:查询两表中的所有字段,满足性别为‘男’的记录(使用语句块)
    JS 进阶1
    JS 小练习
    驼峰法
    JS 入门四
    JS 入门三
    javascript中window.open()与window.location.href的区别(转)
    JavaScript 之日起对象(转)
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/7045376.html
Copyright © 2011-2022 走看看