用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - c代码库

二分匹配部分

2016-06-27 作者: 一亿光年的距离举报

[c]代码库

int n1,n2,edge;
int map[M][M];//邻接矩阵
int vis[M];//n2,集合中对每一个点的访问做标记
int match[M};//表示当前n1中可以与 n2 集合中相邻的点
void init( )
{
    int n1,n2,edge;
    scanf("%d%d%d",&n1,&n2,&edge);
    memset(map,0,sizeof(map));
    memset(match,0,sizeof(match));
    for(int i=0;i<edge;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        map[x][y]=1;
    }
}
 
int find(int node)//是否存在n1集合中以结点node开始的增广路
{
  for(int i=1;i<=n2;i++)
    if(map[node][i]&&!vis[i]==0)//如果节点 i 与 node相邻并且未访问过
    {
      vis[i]=1;
      if(match[i]==-1||find(match[i]))//如果找到一个未覆盖点i中或从与i相邻的节点出发有增广路
      {
        match[i]=node;
        return 1;  
      }
    }  
  return 0;
}
 
int result_max_match(int n1)//返回最大二分匹配值
{
  int i,ans=0;
  for(i=1;i<=n1;i++)
  {
    memset(vis,0,sizeof(vis));//注意初始化
    if(find(i))
      ans++;
  }
  return ans;
}


网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...