POJ3041 Asteroids 二分匹配-匈牙利算法

来源:互联网 发布:ubuntu切换中文输入法 编辑:程序博客网 时间:2024/05/16 11:02

Problem Address:http://poj.org/problem?id=3041


【思路】


事实上,最小点集覆盖数等于二分图的最大匹配。

以行和列为点,如果某个点有asteroid,则新建一个 i->j 的连接。

则问题变成求最小点集覆盖。

最后求其二分图的最大匹配则为答案。


参考“二分图最大匹配的König定理及其证明”:http://www.cnblogs.com/mjc467621163/articles/2110823.html


【代码】


#include <iostream>    using namespace std;     const int maxn = 500;     bool g[maxn+5][maxn+5]; bool y[maxn+5];  int link[maxn+5];  bool find(int v, int m)  {      int i;      for(i=1;i<=m;i++)      {          if(g[v][i] && !y[i])          {              y[i]=true;              if(link[i]==0 || find(link[i],m))              {                  link[i]=v;                  return true;              }          }      }      return false;  }  int main()  {      int n, k;      int i, j;    int a, b;    int ct;  scanf("%d %d", &n, &k);  memset(g, false, sizeof(g));  memset(link, 0, sizeof(link));  for (i=0; i<k; i++){scanf("%d %d", &a, &b);g[a][b] = true;}ct = 0;  for(i=1; i<=n ; i++) {  for (j=0; j<=n; j++)  y[j] = false;  if(find(i, n))  {  ct++;  }  }  printf("%d\n", ct);      return 0;  }  


原创粉丝点击