hdu 1281 二分匹配

本文介绍了一种利用最大匹配算法解决棋盘上放置车的问题,旨在寻找车的最大数量及不可替代的位置。通过构建图模型,并使用匈牙利算法求解最大匹配,进一步确定哪些位置对于达到最大数量至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:

     在图上给出一些点,安放车,让其不相互攻击,求车的最大值!!并求出那些点不可代替!!

构图:

    将各自的x,y坐标提出了,建立边!!xi,yi边的匹配的最大值就是车的数量!!!删除每条边,如果车的数量有所减少则是不可替代的车!!

代码:

#include<iostream>
#include<cstdio>
#include<memory.h>
#include<algorithm>
using namespace std;
int vis[102],mat[102];
int n,m,k,tx,ty,x[102],y[102];
int f[1002][1002];
int find(int x)
{
    for(int i=f[x][0]; i>=1; i--)
    {
        int y=f[x][i];
        if(!vis[y])
        {
            if(x==tx&&y==ty) continue;
            vis[y]=1;
            if(mat[y]==-1||find(mat[y]))
            {
                mat[y]=x;
                return 1;
            }
        }
    }
    return 0;
}
int main ()
{
    int i,j,t;
    int m,n,k,ans,cas=1;
    while(scanf("%d%d%d",&n,&m,&k)!=EOF)
    {
        memset(f,0,sizeof(f));
        memset(mat,-1,sizeof(mat));
        ans=0;
        int Max=0;
        tx=-1,ty=-1;
        for(i=1; i<=k; i++)
        {
            scanf("%d %d",&x[i],&y[i]);
            f[x[i]][++f[x[i]][0]]=y[i];
        }
        for(i=1; i<=n; i++)
        {
            memset(vis,0,sizeof(vis));
            if(find(i))
                Max++;
        }
        int imp=0;
        for(i=1; i<=n; i++)
        {
            for(t=f[i][0]; t>=1; t--)
            {
                memset(mat,-1,sizeof(mat));
                ans=0;
                tx=i;ty=f[i][t];
                for(j=1; j<=n; j++)
                {
                    memset(vis,0,sizeof(vis));
                    if(find(j))ans++;
                }
                if(ans<Max) imp++;
            }

        }
        printf("Board %d have %d important blanks for %d chessmen.\n",cas++,imp,Max);
    }
    return 0;
}
/*
3 3 4
1 2
1 3
2 1
2 2
3 3 4
1 2
2 3
2 1
3 2
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值