HDU 1281 棋盘游戏(匈牙利算法 二分最大匹配)

来源:互联网 发布:coc墙升级数据 编辑:程序博客网 时间:2024/04/30 20:30

题意好理解,就最多能放几个车,而重要点的求解,,先求出最大匹配数m,每次去掉一个边(也就是一个关系)然后求最大匹配数k,如果k<m,说明该点是个重要点,因为少了此点最大匹配数不够原来的值了


题目链接:点击打开链接


代码注释:


<strong><span style="font-size:18px;color:#ff6600;">#include<iostream>#include<cstring>#include<cstdio>using namespace std;#define N 105int a[N][N],visit[N],link[N];int n,m;int dfs(int i){    for(int j=1; j<=m; j++)    {        if(a[i][j]&&!visit[j])        {            visit[j]=1;            if(link[j]==-1||dfs(link[j]))            {                link[j]=i;                return 1;            }        }    }    return 0;}int hungary(){    int sum=0;    memset(link,-1,sizeof(link));    for(int i=1; i<=n; i++)    {        memset(visit,0,sizeof(visit));        if(dfs(i))            sum++;    }    return sum;}int main(){    int i,k,t=1;    int x[N*N],y[N*N];    while(cin>>n>>m>>k)    {        memset(a,0,sizeof(a));        for(i=0; i<k; i++)        {            scanf("%d%d",&x[i],&y[i]);            a[x[i]][y[i]]=1;        }        int sum=hungary(); //前面就是模版hungary求最大匹配数,不懂得看我之前的博客        int ans=0;        for(i=0; i<k; i++)//这里就是判断是不是重要点        {            a[x[i]][y[i]]=0;            int tem=hungary();            if(tem<sum)                ans++;            a[x[i]][y[i]]=1;        }        printf("Board %d have %d important blanks for %d chessmen.\n",t++,ans,hungary());    }}</span></strong>


0 0
原创粉丝点击