zoukankan      html  css  js  c++  java
  • Asteroids(匈牙利算法)

    求最小点覆盖数,即最大匹配数,匈牙利算法。

     1 #include<stdio.h>
     2 #include<string.h>
     3 int map[505][505],vis[505],linker[505];//linker[]记录V2中的点i在V1中所匹配的点x的编号 
     4 int n,k;
     5 int dfs(int x)
     6 {
     7     for (int i = 1; i <= n; i++)
     8     {
     9         if (map[x][i] && !vis[i])//x到i有边且i点未被标记
    10         {
    11             vis[i] = 1;
    12             if (!linker[i]||dfs(linker[i]))//i没有匹配或被i匹配到的点可以找到增广路
    13             {
    14                 linker[i] = x;//更新匹配
    15                 return 1;//匹配成功
    16             }
    17         }
    18     }
    19     return 0;//匹配失败
    20 }
    21 int main()
    22 {
    23     scanf("%d%d",&n,&k);
    24     memset(map,0,sizeof(map));
    25     memset(linker,0,sizeof(linker));
    26     for (int i = 1; i <= k; i++)
    27     {
    28         int u,v;
    29         scanf("%d%d",&u,&v);
    30         map[u][v] = 1;
    31     }
    32     int cnt = 0;
    33     for (int i = 1; i <= n; i ++)
    34     {
    35         memset(vis,0,sizeof(vis));//清除标记
    36         if (dfs(i))
    37             cnt++;
    38     }
    39     printf("%d
    ",cnt);
    40     return 0;
    41 }
    View Code
  • 相关阅读:
    有向图的强连通分量——tarjan
    最小生成树——Kruskal算法
    最小生成树——Prim算法
    递归的正确切入方法
    大整数类概述
    初涉算法——STL初步
    初涉算法——C++
    ACM常用模板
    ACM入门步骤(一)
    划分树
  • 原文地址:https://www.cnblogs.com/lahblogs/p/3266359.html
Copyright © 2011-2022 走看看