hdu 4619 Warm up 2 ( 二分圖最大匹配 )

題目:Warm up 2

題意:有橫豎兩種方式放着的多米諾骨牌,相同方向的不可能重疊,但是橫放和豎放

            的牌可能重疊。移走重疊的牌使剩下的牌最多。

分析:二分圖匹配:最大獨立集=頂點數-最大匹配數

            橫放的爲一個點集,豎放的爲一個點集。

代碼:

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;

struct node
{
    int x1,y1;
    int x2,y2;
}hori[1010],ver[1010];
int g[1010][1010];
int vis[1010];
int match[1010];
int m,n;

bool dfs(int u)
{
    int i;
    for(i=0;i<m;i++)
    {
        if(g[u][i] && !vis[i])
        {
            vis[i]=true;
            if(match[i]==-1||dfs(match[i]))
            {
                match[i]=u;
                return true;
            }
        }
    }
    return false;
}
int main()
{
    int i,j,cnt,ans;
    while(scanf("%d%d",&n,&m)&&n&&m)
    {
        memset(match,-1,sizeof(match));
        memset(g,0,sizeof(g));
        cnt=0;
        for(i=0;i<n;i++)
        {
            scanf("%d%d",&hori[i].x1,&hori[i].y1);
            hori[i].x2=hori[i].x1+1;
            hori[i].y2=hori[i].y1;
            cnt++;
        }
        for(i=0;i<m;i++)
        {
            scanf("%d%d",&ver[i].x1,&ver[i].y1);
            ver[i].x2=ver[i].x1;
            ver[i].y2=ver[i].y1+1;
            cnt++;
        }
        //printf("cnt=%d\n",cnt);
        for(i=0;i<n;i++)
        {
            for(j=0;j<m;j++)
            {
                if(hori[i].x1==ver[j].x1 && hori[i].y1==ver[j].y1)
                    g[i][j]=true;
                else if(hori[i].x2==ver[j].x1 && hori[i].y2==ver[j].y1)
                    g[i][j]=true;
                else if(hori[i].x1==ver[j].x2 && hori[i].y1==ver[j].y2)
                    g[i][j]=true;
                else if(hori[i].x2==ver[j].x2 && hori[i].y2==ver[j].y2)
                    g[i][j]=true;
            }
        }
        ans=0;
        for(i=0;i<n;i++)
        {
            memset(vis,0,sizeof(vis));
            if(dfs(i)) ans++;
        }
        //printf("ans=%d\n",ans);
        printf("%d\n",cnt-ans);
    }
    return 0;
}


發佈了96 篇原創文章 · 獲贊 13 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章