码迷,mamicode.com
首页 > 其他好文 > 详细

hdu1281+hdu2819(最大匹配数)

时间:2015-02-11 23:13:40      阅读:221      评论:0      收藏:0      [点我收藏+]

标签:

 

分析:将行和列缩点,即行对应二分图的X部,列对应二分图的Y部,然后交点为连接该行和该列的一条边。匹配时每点都会把整行整列占了,因此就不会出现冲突了。

传送门:hdu1281 棋盘游戏

技术分享
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstdlib>
#include <stack>
#include <vector>
#include <set>
#include <map>
#define LL long long
#define mod 100000000
#define inf 0x3f3f3f3f
#define eps 1e-6
#define N 110
#define FILL(a,b) (memset(a,b,sizeof(a)))
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define PII pair<int,int>
using namespace std;
int match[N],vis[N],n,m,k;
int g[N][N],a[N*N][2],x,y;
int dfs(int u)
{
    for(int i=1;i<=m;i++)
    {
        if(!vis[i]&&g[u][i])
        {
            vis[i]=1;
            if(match[i]==-1||dfs(match[i]))
            {
                match[i]=u;
                return 1;
            }
        }
    }
    return 0;
}
int hungary()
{
    memset(match,-1,sizeof(match));
    int ans=0;
    for(int i=1;i<=n;i++)
    {
        memset(vis,0,sizeof(vis));
        if(dfs(i))ans++;
    }
    return ans;
}
int main()
{
    int cas=1;
    while(scanf("%d%d%d",&n,&m,&k)>0)
    {
        memset(g,0,sizeof(g));
        for(int i=1;i<=k;i++)
        {
            scanf("%d%d",&x,&y);
            g[x][y]=1;
            a[i][0]=x;
            a[i][1]=y;
        }
        int res=hungary();
        int ans=0;
        for(int i=1;i<=k;i++)
        {
            g[a[i][0]][a[i][1]]=0;
            int maxn=hungary();
            if(maxn<res)ans++;
            g[a[i][0]][a[i][1]]=1;
        }
        printf("Board %d have %d important blanks for %d chessmen.\n",cas++,ans,res);
    }
}
View Code

 

传送门:hdu2819 Swap

技术分享
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstdlib>
#include <stack>
#include <vector>
#include <set>
#include <map>
#define LL long long
#define mod 100000000
#define inf 0x3f3f3f3f
#define eps 1e-6
#define N 110
#define FILL(a,b) (memset(a,b,sizeof(a)))
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define PII pair<int,int>
using namespace std;
int match[N],vis[N],n,m;
int g[N][N],a[N*N][2];
int dfs(int u)
{
    for(int i=1;i<=n;i++)
    {
        if(!vis[i]&&g[u][i])
        {
            vis[i]=1;
            if(match[i]==-1||dfs(match[i]))
            {
                match[i]=u;
                return 1;
            }
        }
    }
    return 0;
}
int hungary()
{
    memset(match,-1,sizeof(match));
    int ans=0;
    for(int i=1;i<=n;i++)
    {
        memset(vis,0,sizeof(vis));
        if(dfs(i))ans++;
    }
    return ans;
}
int main()
{
    int cas=1;
    while(scanf("%d",&n)>0)
    {
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
            scanf("%d",&g[i][j]);
        int res=hungary();
        if(res!=n)
        {
            puts("-1");
            continue;
        }
        int sum=0,i,j;
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=n;j++)
            {
                if(match[j]==i)break;
            }
            if(i==j)continue;
            sum++;
            a[sum][0]=i;
            a[sum][1]=j;
            swap(match[i],match[j]);
        }
        printf("%d\n",sum);
        for(int i=1;i<=sum;i++)
            printf("C %d %d\n",a[i][0],a[i][1]);
    }
}
View Code

 

hdu1281+hdu2819(最大匹配数)

标签:

原文地址:http://www.cnblogs.com/lienus/p/4287071.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!