Chinaunix首页 | 论坛 | 博客
  • 博客访问: 198264
  • 博文数量: 67
  • 博客积分: 2970
  • 博客等级: 少校
  • 技术积分: 685
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-23 11:36
文章分类

全部博文(67)

文章存档

2012年(2)

2011年(19)

2010年(46)

我的朋友

分类: C/C++

2010-08-05 14:48:01

#include<stdio.h>

const int Maxn=101;
bool g[Maxn][Maxn],visit[Maxn];
int link[Maxn];
int n,m;

bool find(int x)
{
    for(int i=1;i<=m;i++)
    {
        if(g[x][i]&&!visit[i])
        {
            visit[i]=true;
            if(link[i]==0||find(link[i]))        
            {                                    
                link[i]=x;                        
                return true;
            }                                    
        }
    }
    return false;
}

int main()
{
    int k;
    while(scanf("%d",&n),n)
    {
        scanf("%d%d",&m,&k);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                g[i][j]=false;

        for(int i=1;i<=m;i++)
            link[i]=0;

        for(int i=1;i<=k;i++)
        {
            int v1,v2;
            scanf("%*d%d%d",&v1,&v2);
            g[v1][v2]=true;
        }

        int match=0;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)        
                visit[j]=false;
            if(find(i))    match++;
        }
        printf("%d\n",match);
    }
    return 0;
}


 

解题思路:

由题意可知,要用最少的点集关联所有的边,即求二分图的最小顶点覆盖。

二分图的最小顶点覆盖=二分图的最大顶点匹配数,具体证明参看Matrix67大牛的证明。

阅读(707) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~