HDU 1281 棋盘游戏(二分图匹配)

来源:互联网 发布:淘宝账号如何实名认证 编辑:程序博客网 时间:2024/05/18 17:59

解题思路:

枚举棋盘上所有格子,如果讲该点删除后,最大匹配数会减少,则该点为关键点。

#include <iostream>#include <cstring>#include <cstdlib>#include <cstdio>#include <vector>#include <algorithm>using namespace std;const int MAXN = 100 + 10;int G[MAXN][MAXN];int vis[MAXN];int match[MAXN];int n, m, k;int path(int u){    for(int v=1;v<=m;v++)    {        if(G[u][v] && !vis[v])        {            vis[v] = 1;            if(match[v] == -1 || path(match[v]))            {                match[v] = u;                return 1;            }        }    }    return 0;}int MaxMatch(){    int res = 0;    memset(match, -1, sizeof(match));    for(int i=1;i<=n;i++)    {        memset(vis, 0, sizeof(vis));        if(path(i)) res++;    }    return res;}int main(){    int kcase = 1;    while(scanf("%d%d%d", &n, &m, &k)!=EOF)    {        int x, y;        memset(G, 0, sizeof(G));        for(int i=1;i<=k;i++)        {            scanf("%d%d", &x, &y);            G[x][y] = 1;        }        int ans = 0;        int acc = MaxMatch();        for(int i=1;i<=n;i++)        {            for(int j=1;j<=m;j++)            {                if(G[i][j])                {                    G[i][j] = 0;                    if(acc > MaxMatch())                        ans++;                    G[i][j] = 1;                }            }        }        printf("Board %d have %d important blanks for %d chessmen.\n", kcase++, ans, acc);    }    return 0;}


0 0
原创粉丝点击