匈牙利算法

只是想贴一张图
图是原创的
增广路径

代码是从《啊哈算法》中抄的 1
book 数组这个地方一直都很奇怪,
如果说对应dfs中的当前路径中节点,所以每次dfs前都要重置。但是又不能再dfs返回前吧这个值重新值为零,因为下一次搜索到同一个地方,如果知道这个点已经访问过,就证明这个点必然不能形成增光路径,因此就不用再访问。
但是如果说仅仅是已经访问过的节点,每次最外层的for循环又会把它重置,说不过去。

感觉一个alternative是,
如果dfs返回是true,book[i]=0,如果false,就维持book[i]不变,这样就不用在外层循环中置空。

#include<cstdio>
using namespace std;

int e[101][101];
int match[101];
int book[101];
int n , m;
int dfs(int u)
{
     int i;
     for(i = 1;i <= n;i++)
     {
          if(book[i] == 0 && e[u][i] == 1)
          {
            //book 这个地方一直都很奇怪
                book[i] = 1;
                if(match[i] == 0 || dfs(match[i]))
                {
                     match[i] = u;
                     match[u] = i;
                     return 1;
                }
          }
     }

     return 0;
}

int main()
{
      int i , j , t1 , t2 , sum = 0;
      scanf("%d %d",&n,&m);

      for(i = 1;i <= m;i++)
      {
            scanf("%d %d",&t1,&t2);
            e[t1][t2] = 1;
            e[t2][t1] = 1;
      }

        for(i = 1;i <= n;i++)   match[i] = 0;

        for(i = 1;i <= n;i++)
        {
              for(j = 1;j <= n;j++)  book[j] = 0;
                  if(dfs(i))  sum++;
        }

        printf("%d",sum);

        return 0;
}

视频参考:
https://www.bilibili.com/video/av16362938/?from=search&seid=4181204272014712416

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值